From cc4cc89e27873d03da3cde6081b2823437db0101 Mon Sep 17 00:00:00 2001 From: click33 <2393584716@qq.com> Date: Tue, 31 Aug 2021 00:11:00 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20Http=20Basic=20=E8=AE=A4?= =?UTF-8?q?=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../action/SaTokenActionDefaultImpl.java | 8 ++ .../satoken/annotation/SaCheckBasic.java | 32 ++++++++ .../dev33/satoken/basic/SaBasicTemplate.java | 79 +++++++++++++++++++ .../cn/dev33/satoken/basic/SaBasicUtil.java | 48 +++++++++++ .../dev33/satoken/config/SaTokenConfig.java | 27 ++++++- .../satoken/context/model/SaResponse.java | 7 ++ .../exception/NotBasicAuthException.java | 24 ++++++ .../cn/dev33/satoken/aop/SaCheckAspect.java | 3 +- .../pom.xml | 14 +++- .../reactor/model/SaResponseForReactor.java | 9 +++ .../satoken/reactor/spring/SaBeanInject.java | 12 +++ .../spring/oauth2/SaOAuth2BeanInject.java | 40 ++++++++++ .../spring/oauth2/SaOAuth2BeanRegister.java | 28 +++++++ .../reactor/spring/oauth2/package-info.java | 4 + .../main/resources/META-INF/spring.factories | 4 +- .../servlet/model/SaResponseForServlet.java | 10 +++ .../cn/dev33/satoken/solon/XPluginImp.java | 8 ++ .../solon/model/SaResponseForSolon.java | 6 ++ .../cn/dev33/satoken/spring/SaBeanInject.java | 12 +++ 19 files changed, 366 insertions(+), 9 deletions(-) create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckBasic.java create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicTemplate.java create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicUtil.java create mode 100644 sa-token-core/src/main/java/cn/dev33/satoken/exception/NotBasicAuthException.java create mode 100644 sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/oauth2/SaOAuth2BeanInject.java create mode 100644 sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/oauth2/SaOAuth2BeanRegister.java create mode 100644 sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/oauth2/package-info.java diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java b/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java index 3595de88..11a5d287 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/action/SaTokenActionDefaultImpl.java @@ -6,10 +6,12 @@ import java.util.List; import java.util.UUID; import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.annotation.SaCheckBasic; import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckRole; import cn.dev33.satoken.annotation.SaCheckSafe; +import cn.dev33.satoken.basic.SaBasicUtil; import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.util.SaFoxUtil; import cn.dev33.satoken.util.SaTokenConsts; @@ -133,6 +135,12 @@ public class SaTokenActionDefaultImpl implements SaTokenAction { SaCheckSafe at = target.getAnnotation(SaCheckSafe.class); SaManager.getStpLogic(null).checkByAnnotation(at); } + + // 校验 @SaCheckBasic 注解 + if(target.isAnnotationPresent(SaCheckBasic.class)) { + SaCheckBasic at = target.getAnnotation(SaCheckBasic.class); + SaBasicUtil.check(at.realm(), at.account()); + } } } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckBasic.java b/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckBasic.java new file mode 100644 index 00000000..84e4a148 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/annotation/SaCheckBasic.java @@ -0,0 +1,32 @@ +package cn.dev33.satoken.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import cn.dev33.satoken.basic.SaBasicTemplate; + +/** + * Http Basic 认证:只有通过 Basic 认证才能进入该方法 + *

可标注在函数、类上(效果等同于标注在此类的所有方法上) + * @author kong + * + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.METHOD, ElementType.TYPE }) +public @interface SaCheckBasic { + + /** + * 领域 + * @return see note + */ + String realm() default SaBasicTemplate.DEFAULT_REALM; + + /** + * 需要校验的账号密码 + * @return see note + */ + String account() default ""; + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicTemplate.java b/sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicTemplate.java new file mode 100644 index 00000000..2bf87f7f --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicTemplate.java @@ -0,0 +1,79 @@ +package cn.dev33.satoken.basic; + +import cn.dev33.satoken.SaManager; +import cn.dev33.satoken.context.SaHolder; +import cn.dev33.satoken.exception.NotBasicAuthException; +import cn.dev33.satoken.secure.SaBase64Util; +import cn.dev33.satoken.util.SaFoxUtil; + +/** + * Sa-Token Http Basic 认证模块 + * @author kong + * + */ +public class SaBasicTemplate { + + /** + * 默认的 Realm 名称 + */ + public static final String DEFAULT_REALM = "Sa-Token"; + + /** + * 设置响应头,并抛出异常 + * @param realm 领域 + */ + public void throwNotBasicAuthException(String realm) { + SaHolder.getResponse().setStatus(401).setHeader("WWW-Authenticate", "Basic Realm=" + realm); + throw new NotBasicAuthException(); + } + + /** + * 获取浏览器提交的 Basic 参数 (裁剪掉前缀并解码) + * @return 值 + */ + public String getAuthorizationValue() { + + // 获取请求头 Authorization 参数 + String authorization = SaHolder.getRequest().getHeader("Authorization"); + + // 如果不是以 Basic 作为前缀,则视为无效 + if(authorization == null || authorization.startsWith("Basic ") == false) { + return null; + } + + // 裁剪前缀并解码 + return SaBase64Util.decode(authorization.substring(6)); + } + + /** + * 对当前会话进行 Basic 校验(使用全局配置的账号密码),校验不通过则抛出异常 + * @param basicAccount 账号(格式为 user:password) + */ + public void check() { + check(DEFAULT_REALM, SaManager.getConfig().getBasic()); + } + + /** + * 对当前会话进行 Basic 校验(手动设置账号密码),校验不通过则抛出异常 + * @param account 账号(格式为 user:password) + */ + public void check(String account) { + check(DEFAULT_REALM, account); + } + + /** + * 对当前会话进行 Basic 校验(手动设置 Realm & 账号密码),校验不通过则抛出异常 + * @param realm 领域 + * @param account 账号(格式为 user:password) + */ + public void check(String realm, String account) { + if(SaFoxUtil.isEmpty(account)) { + account = SaManager.getConfig().getBasic(); + } + String authorization = getAuthorizationValue(); + if(SaFoxUtil.isEmpty(authorization) || authorization.equals(account) == false) { + throwNotBasicAuthException(realm); + } + } + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicUtil.java b/sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicUtil.java new file mode 100644 index 00000000..668198f5 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/basic/SaBasicUtil.java @@ -0,0 +1,48 @@ +package cn.dev33.satoken.basic; + +/** + * Sa-Token Http Basic 认证 Util + * @author kong + * + */ +public class SaBasicUtil { + + /** + * 底层 SaBasicTemplate 对象 + */ + public static SaBasicTemplate saBasicTemplate = new SaBasicTemplate(); + + /** + * 获取浏览器提交的 Basic 参数 (裁剪掉前缀并解码) + * @return 值 + */ + public static String getAuthorizationValue() { + return saBasicTemplate.getAuthorizationValue(); + } + + /** + * 对当前会话进行 Basic 校验(使用全局配置的账号密码),校验不通过则抛出异常 + * @param basicAccount 账号(格式为 user:password) + */ + public static void check() { + saBasicTemplate.check(); + } + + /** + * 对当前会话进行 Basic 校验(手动设置账号密码),校验不通过则抛出异常 + * @param account 账号(格式为 user:password) + */ + public static void check(String account) { + saBasicTemplate.check(account); + } + + /** + * 对当前会话进行 Basic 校验(手动设置 Realm & 账号密码),校验不通过则抛出异常 + * @param realm 领域 + * @param account 账号(格式为 user:password) + */ + public static void check(String realm, String account) { + saBasicTemplate.check(realm, account); + } + +} diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java index 16af53ca..ea50727b 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaTokenConfig.java @@ -74,6 +74,11 @@ public class SaTokenConfig implements Serializable { * Id-Token的有效期 (单位: 秒) */ private long idTokenTimeout = 60 * 60 * 24; + + /** + * Http Basic 认证的账号&密码 + */ + private String basic = ""; /** @@ -373,6 +378,22 @@ public class SaTokenConfig implements Serializable { this.idTokenTimeout = idTokenTimeout; return this; } + + /** + * @return Http Basic 认证的账号&密码 + */ + public String getBasic() { + return basic; + } + + /** + * @param basic Http Basic 认证的账号&密码 + * @return 对象自身 + */ + public SaTokenConfig setBasic(String basic) { + this.basic = basic; + return this; + } /** * @return SSO单点登录配置对象 @@ -388,6 +409,7 @@ public class SaTokenConfig implements Serializable { this.sso = sso; } + @Override public String toString() { return "SaTokenConfig [tokenName=" + tokenName + ", timeout=" + timeout + ", activityTimeout=" + activityTimeout @@ -396,12 +418,9 @@ public class SaTokenConfig implements Serializable { + ", dataRefreshPeriod=" + dataRefreshPeriod + ", tokenSessionCheckLogin=" + tokenSessionCheckLogin + ", autoRenew=" + autoRenew + ", cookieDomain=" + cookieDomain + ", tokenPrefix=" + tokenPrefix + ", isPrint=" + isPrint + ", isLog=" + isLog + ", jwtSecretKey=" + jwtSecretKey + ", idTokenTimeout=" - + idTokenTimeout + ", sso=" + sso + "]"; + + idTokenTimeout + ", basic=" + basic + ", sso=" + sso + "]"; } - - - /** *

本函数设计已过时,未来版本可能移除此函数,请及时更换为 setIsConcurrent() ,使用方式保持不变

* @param allowConcurrentLogin see note diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java b/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java index 66b88221..fa4de08b 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/context/model/SaResponse.java @@ -28,6 +28,13 @@ public interface SaResponse { * @param timeout 过期时间 (秒) */ public void addCookie(String name, String value, String path, String domain, int timeout); + + /** + * 设置响应状态码 + * @param sc 响应状态码 + * @return 对象自身 + */ + public SaResponse setStatus(int sc); /** * 在响应头里写入一个值 diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotBasicAuthException.java b/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotBasicAuthException.java new file mode 100644 index 00000000..bbbd5ee9 --- /dev/null +++ b/sa-token-core/src/main/java/cn/dev33/satoken/exception/NotBasicAuthException.java @@ -0,0 +1,24 @@ +package cn.dev33.satoken.exception; + +/** + * 一个异常:代表会话未能通过 Http Basic 认证 + * @author kong + */ +public class NotBasicAuthException extends SaTokenException { + + /** + * 序列化版本号 + */ + private static final long serialVersionUID = 6806129545290130144L; + + /** 异常提示语 */ + public static final String BE_MESSAGE = "no basic auth"; + + /** + * 一个异常:代表会话未通过 Http Basic 认证 + */ + public NotBasicAuthException() { + super(BE_MESSAGE); + } + +} diff --git a/sa-token-plugin/sa-token-spring-aop/src/main/java/cn/dev33/satoken/aop/SaCheckAspect.java b/sa-token-plugin/sa-token-spring-aop/src/main/java/cn/dev33/satoken/aop/SaCheckAspect.java index 0ddfb0d9..9a1c3e78 100644 --- a/sa-token-plugin/sa-token-spring-aop/src/main/java/cn/dev33/satoken/aop/SaCheckAspect.java +++ b/sa-token-plugin/sa-token-spring-aop/src/main/java/cn/dev33/satoken/aop/SaCheckAspect.java @@ -34,7 +34,8 @@ public class SaCheckAspect { "@within(cn.dev33.satoken.annotation.SaCheckLogin) || @annotation(cn.dev33.satoken.annotation.SaCheckLogin) || " + "@within(cn.dev33.satoken.annotation.SaCheckRole) || @annotation(cn.dev33.satoken.annotation.SaCheckRole) || " + "@within(cn.dev33.satoken.annotation.SaCheckPermission) || @annotation(cn.dev33.satoken.annotation.SaCheckPermission) || " - + "@within(cn.dev33.satoken.annotation.SaCheckSafe) || @annotation(cn.dev33.satoken.annotation.SaCheckSafe)"; + + "@within(cn.dev33.satoken.annotation.SaCheckSafe) || @annotation(cn.dev33.satoken.annotation.SaCheckSafe) || " + + "@within(cn.dev33.satoken.annotation.SaCheckBasic) || @annotation(cn.dev33.satoken.annotation.SaCheckBasic)"; /** * 声明AOP签名 diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/pom.xml b/sa-token-starter/sa-token-reactor-spring-boot-starter/pom.xml index e23c0359..06d80d5a 100644 --- a/sa-token-starter/sa-token-reactor-spring-boot-starter/pom.xml +++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/pom.xml @@ -27,23 +27,31 @@ org.springframework.boot spring-boot-starter 2.0.0.RELEASE - compile + true org.springframework spring-web 5.0.4.RELEASE - compile + true io.projectreactor reactor-core 3.1.4.RELEASE - compile + true + + + cn.dev33 + sa-token-oauth2 + ${sa-token-version} + true + + org.springframework.boot spring-boot-configuration-processor diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java index 4954e903..a76b1479 100644 --- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java +++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/model/SaResponseForReactor.java @@ -74,6 +74,15 @@ public class SaResponseForReactor implements SaResponse { response.addCookie(builder.build()); } + /** + * 设置响应状态码 + */ + @Override + public SaResponse setStatus(int sc) { + response.setStatusCode(HttpStatus.valueOf(sc)); + return this; + } + /** * 在响应头里写入一个值 */ diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaBeanInject.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaBeanInject.java index 0eaf4cf3..a6fd9863 100644 --- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaBeanInject.java +++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/SaBeanInject.java @@ -6,6 +6,8 @@ import org.springframework.util.PathMatcher; import cn.dev33.satoken.SaManager; import cn.dev33.satoken.action.SaTokenAction; +import cn.dev33.satoken.basic.SaBasicTemplate; +import cn.dev33.satoken.basic.SaBasicUtil; import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.context.SaTokenContext; import cn.dev33.satoken.dao.SaTokenDao; @@ -105,6 +107,16 @@ public class SaBeanInject { SaIdUtil.saIdTemplate = saIdTemplate; } + /** + * 注入 Sa-Token Http Basic 认证模块 + * + * @param saBasicTemplate saBasicTemplate对象 + */ + @Autowired(required = false) + public void setSaSsoTemplate(SaBasicTemplate saBasicTemplate) { + SaBasicUtil.saBasicTemplate = saBasicTemplate; + } + /** * 注入 Sa-Token-SSO 单点登录模块 Bean * diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/oauth2/SaOAuth2BeanInject.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/oauth2/SaOAuth2BeanInject.java new file mode 100644 index 00000000..3c48eacc --- /dev/null +++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/oauth2/SaOAuth2BeanInject.java @@ -0,0 +1,40 @@ +package cn.dev33.satoken.reactor.spring.oauth2; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; + +import cn.dev33.satoken.oauth2.SaOAuth2Manager; +import cn.dev33.satoken.oauth2.config.SaOAuth2Config; +import cn.dev33.satoken.oauth2.logic.SaOAuth2Template; +import cn.dev33.satoken.oauth2.logic.SaOAuth2Util; + +/** + * 注入 Sa-Token-OAuth2 所需要的Bean + * + * @author kong + * + */ +@ConditionalOnClass(SaOAuth2Manager.class) +public class SaOAuth2BeanInject { + + /** + * 注入OAuth2配置Bean + * + * @param saOAuth2Config 配置对象 + */ + @Autowired(required = false) + public void setSaOAuth2Config(SaOAuth2Config saOAuth2Config) { + SaOAuth2Manager.setConfig(saOAuth2Config); + } + + /** + * 注入代码模板Bean + * + * @param saOAuth2Template 代码模板Bean + */ + @Autowired(required = false) + public void setSaOAuth2Interface(SaOAuth2Template saOAuth2Template) { + SaOAuth2Util.saOAuth2Template = saOAuth2Template; + } + +} diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/oauth2/SaOAuth2BeanRegister.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/oauth2/SaOAuth2BeanRegister.java new file mode 100644 index 00000000..ff83c816 --- /dev/null +++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/oauth2/SaOAuth2BeanRegister.java @@ -0,0 +1,28 @@ +package cn.dev33.satoken.reactor.spring.oauth2; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.annotation.Bean; + +import cn.dev33.satoken.oauth2.SaOAuth2Manager; +import cn.dev33.satoken.oauth2.config.SaOAuth2Config; + +/** + * 注册 Sa-Token-OAuth2 所需要的Bean + * @author kong + * + */ +@ConditionalOnClass(SaOAuth2Manager.class) +public class SaOAuth2BeanRegister { + + /** + * 获取OAuth2配置Bean + * @return 配置对象 + */ + @Bean + @ConfigurationProperties(prefix = "sa-token.oauth2") + public SaOAuth2Config getSaOAuth2Config() { + return new SaOAuth2Config(); + } + +} diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/oauth2/package-info.java b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/oauth2/package-info.java new file mode 100644 index 00000000..9b839809 --- /dev/null +++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/java/cn/dev33/satoken/reactor/spring/oauth2/package-info.java @@ -0,0 +1,4 @@ +/** + * Sa-Token-OAuth2 模块自动化配置(只有引入了Sa-Token-OAuth2模块后,此包下的代码才会开始工作) + */ +package cn.dev33.satoken.reactor.spring.oauth2; \ No newline at end of file diff --git a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/resources/META-INF/spring.factories b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/resources/META-INF/spring.factories index cecda683..020ec1a0 100644 --- a/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/resources/META-INF/spring.factories +++ b/sa-token-starter/sa-token-reactor-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -1,4 +1,6 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ cn.dev33.satoken.reactor.spring.SaBeanRegister,\ cn.dev33.satoken.reactor.spring.SaBeanInject,\ -cn.dev33.satoken.reactor.spring.SaHistoryVersionInject \ No newline at end of file +cn.dev33.satoken.reactor.spring.SaHistoryVersionInject,\ +cn.dev33.satoken.reactor.spring.oauth2.SaOAuth2BeanRegister,\ +cn.dev33.satoken.reactor.spring.oauth2.SaOAuth2BeanInject \ No newline at end of file diff --git a/sa-token-starter/sa-token-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaResponseForServlet.java b/sa-token-starter/sa-token-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaResponseForServlet.java index 8e611c73..748e8e96 100644 --- a/sa-token-starter/sa-token-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaResponseForServlet.java +++ b/sa-token-starter/sa-token-servlet/src/main/java/cn/dev33/satoken/servlet/model/SaResponseForServlet.java @@ -62,6 +62,15 @@ public class SaResponseForServlet implements SaResponse { response.addCookie(cookie); } + /** + * 设置响应状态码 + */ + @Override + public SaResponse setStatus(int sc) { + response.setStatus(sc); + return this; + } + /** * 在响应头里写入一个值 */ @@ -84,4 +93,5 @@ public class SaResponseForServlet implements SaResponse { return null; } + } diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java index 3e1b9322..4765dd73 100644 --- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java +++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/XPluginImp.java @@ -11,6 +11,8 @@ import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckRole; import cn.dev33.satoken.annotation.SaCheckSafe; +import cn.dev33.satoken.basic.SaBasicTemplate; +import cn.dev33.satoken.basic.SaBasicUtil; import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.id.SaIdTemplate; @@ -75,10 +77,16 @@ public class XPluginImp implements Plugin { SaIdUtil.saIdTemplate = bw.raw(); }); + // Sa-Token Http Basic 认证模块 Bean + Aop.getAsyn(SaBasicTemplate.class, bw->{ + SaBasicUtil.saBasicTemplate = bw.raw(); + }); + // Sa-Token-SSO 单点登录模块 Bean Aop.getAsyn(SaSsoTemplate.class, bw->{ SaSsoUtil.saSsoTemplate = bw.raw(); }); } + } diff --git a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java index d2511d1d..f7eaaab4 100644 --- a/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java +++ b/sa-token-starter/sa-token-solon-plugin/src/main/java/cn/dev33/satoken/solon/model/SaResponseForSolon.java @@ -36,6 +36,12 @@ public class SaResponseForSolon implements SaResponse { ctx.cookieSet(name, value, domain, path, timeout); } + @Override + public SaResponse setStatus(int sc) { + ctx.statusSet(sc); + return this; + } + @Override public SaResponse setHeader(String name, String value) { ctx.headerSet(name, value); diff --git a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java index 0b3eae22..aeed065a 100644 --- a/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java +++ b/sa-token-starter/sa-token-spring-boot-starter/src/main/java/cn/dev33/satoken/spring/SaBeanInject.java @@ -6,6 +6,8 @@ import org.springframework.util.PathMatcher; import cn.dev33.satoken.SaManager; import cn.dev33.satoken.action.SaTokenAction; +import cn.dev33.satoken.basic.SaBasicTemplate; +import cn.dev33.satoken.basic.SaBasicUtil; import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.context.SaTokenContext; import cn.dev33.satoken.dao.SaTokenDao; @@ -105,6 +107,16 @@ public class SaBeanInject { SaIdUtil.saIdTemplate = saIdTemplate; } + /** + * 注入 Sa-Token Http Basic 认证模块 + * + * @param saBasicTemplate saBasicTemplate对象 + */ + @Autowired(required = false) + public void setSaSsoTemplate(SaBasicTemplate saBasicTemplate) { + SaBasicUtil.saBasicTemplate = saBasicTemplate; + } + /** * 注入 Sa-Token-SSO 单点登录模块 Bean *