diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaSsoConfig.java b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaSsoConfig.java index 70c90f48..8af27bee 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/config/SaSsoConfig.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/config/SaSsoConfig.java @@ -304,7 +304,14 @@ public class SaSsoConfig implements Serializable { this.notLoginView = notLoginView; return this; } - + + /** + * @return 函数 SSO-Server端:未登录时返回的View + */ + public Supplier getNotLoginView() { + return notLoginView; + } + /** * @param doLoginHandle SSO-Server端:登录函数 * @return 对象自身 @@ -314,6 +321,13 @@ public class SaSsoConfig implements Serializable { return this; } + /** + * @return 函数 SSO-Server端:登录函数 + */ + public BiFunction getDoLoginHandle() { + return doLoginHandle; + } + /** * @param ticketResultHandle SSO-Client端:自定义校验Ticket返回值的处理逻辑 (每次从认证中心获取校验Ticket的结果后调用) * @return 对象自身 @@ -322,7 +336,14 @@ public class SaSsoConfig implements Serializable { this.ticketResultHandle = ticketResultHandle; return this; } - + + /** + * @return 函数 SSO-Client端:自定义校验Ticket返回值的处理逻辑 (每次从认证中心获取校验Ticket的结果后调用) + */ + public BiFunction getTicketResultHandle() { + return ticketResultHandle; + } + /** * @param sendHttp SSO-Client端:发送Http请求的处理函数 * @return 对象自身 @@ -332,7 +353,12 @@ public class SaSsoConfig implements Serializable { return this; } - + /** + * @return 函数 SSO-Client端:发送Http请求的处理函数 + */ + public Function getSendHttp() { + return sendHttp; + } } diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoHandle.java b/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoHandle.java index 81cb6578..20ea5efa 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoHandle.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoHandle.java @@ -42,17 +42,17 @@ public class SaSsoHandle { } // SSO-Server端:校验ticket 获取账号id - if(req.isPath(Api.ssoCheckTicket) && cfg.isHttp) { + if(req.isPath(Api.ssoCheckTicket) && cfg.getIsHttp()) { return ssoCheckTicket(); } // SSO-Server端:单点注销 [模式一] (不带loginId参数) - if(req.isPath(Api.ssoLogout) && cfg.isSlo && req.hasParam(ParamName.loginId) == false) { + if(req.isPath(Api.ssoLogout) && cfg.getIsSlo() && req.hasParam(ParamName.loginId) == false) { return ssoServerLogoutType1(); } // SSO-Server端:单点注销 [模式三] (带loginId参数) - if(req.isPath(Api.ssoLogout) && cfg.isHttp && cfg.isSlo && req.hasParam(ParamName.loginId)) { + if(req.isPath(Api.ssoLogout) && cfg.getIsHttp() && cfg.getIsSlo() && req.hasParam(ParamName.loginId)) { return ssoServerLogout(); } @@ -74,7 +74,7 @@ public class SaSsoHandle { // ---------- 此处有两种情况分开处理: // ---- 情况1:在SSO认证中心尚未登录,需要先去登录 if(stpLogic.isLogin() == false) { - return cfg.notLoginView.get(); + return cfg.getNotLoginView().get(); } // ---- 情况2:在SSO认证中心已经登录,需要重定向回 Client 端,而这又分为两种方式: String mode = req.getParam(ParamName.mode, ""); @@ -101,7 +101,7 @@ public class SaSsoHandle { SaSsoConfig cfg = SaManager.getConfig().getSso(); // 处理 - return cfg.doLoginHandle.apply(req.getParam(ParamName.name), req.getParam(ParamName.pwd)); + return cfg.getDoLoginHandle().apply(req.getParam(ParamName.name), req.getParam(ParamName.pwd)); } /** @@ -162,7 +162,7 @@ public class SaSsoHandle { SaSsoUtil.checkSecretkey(secretkey); // step.2 遍历通知Client端注销会话 - SaSsoUtil.forEachSloUrl(loginId, url -> cfg.sendHttp.apply(url)); + SaSsoUtil.forEachSloUrl(loginId, url -> cfg.getSendHttp().apply(url)); // step.3 Server端注销 stpLogic.logout(loginId); @@ -190,17 +190,17 @@ public class SaSsoHandle { } // ---------- SSO-Client端:单点注销 [模式二] - if(req.isPath(Api.ssoLogout) && cfg.isSlo && cfg.isHttp == false) { + if(req.isPath(Api.ssoLogout) && cfg.getIsSlo() && cfg.getIsHttp() == false) { return ssoLogoutType2(); } // ---------- SSO-Client端:单点注销 [模式三] - if(req.isPath(Api.ssoLogout) && cfg.isSlo && cfg.isHttp) { + if(req.isPath(Api.ssoLogout) && cfg.getIsSlo() && cfg.getIsHttp()) { return ssoLogoutType3(); } // ---------- SSO-Client端:单点注销的回调 [模式三] - if(req.isPath(Api.ssoLogoutCall) && cfg.isSlo && cfg.isHttp) { + if(req.isPath(Api.ssoLogoutCall) && cfg.getIsSlo() && cfg.getIsHttp()) { return ssoLogoutCall(); } @@ -240,8 +240,8 @@ public class SaSsoHandle { Object loginId = checkTicket(ticket, Api.ssoLogin); // Be: 如果开发者自定义了处理逻辑 - if(cfg.ticketResultHandle != null) { - return cfg.ticketResultHandle.apply(loginId, back); + if(cfg.getTicketResultHandle() != null) { + return cfg.getTicketResultHandle().apply(loginId, back); } // ------- 2、如果loginId有值,说明ticket有效,进行登录并重定向至back地址 if(loginId != null ) { @@ -289,7 +289,7 @@ public class SaSsoHandle { // 调用SSO-Server认证中心API,进行注销 String url = SaSsoUtil.buildSloUrl(stpLogic.getLoginId()); - String body = String.valueOf(cfg.sendHttp.apply(url)); + String body = String.valueOf(cfg.getSendHttp().apply(url)); if(SaSsoConsts.OK.equals(body) == false) { return SaResult.error("单点注销失败"); } @@ -349,14 +349,14 @@ public class SaSsoHandle { public static Object checkTicket(String ticket, String currUri) { SaSsoConfig cfg = SaManager.getConfig().getSso(); // --------- 两种模式 - if(cfg.isHttp) { + if(cfg.getIsHttp()) { // 模式三:使用http请求校验ticket String ssoLogoutCall = null; - if(cfg.isSlo) { + if(cfg.getIsSlo()) { ssoLogoutCall = SaHolder.getRequest().getUrl().replace(currUri, Api.ssoLogoutCall); } String checkUrl = SaSsoUtil.buildCheckTicketUrl(ticket, ssoLogoutCall); - Object body = cfg.sendHttp.apply(checkUrl); + Object body = cfg.getSendHttp().apply(checkUrl); return (SaFoxUtil.isEmpty(body) ? null : body); } else { // 模式二:直连Redis校验ticket diff --git a/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java b/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java index 03ade003..ef082025 100644 --- a/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java +++ b/sa-token-core/src/main/java/cn/dev33/satoken/sso/SaSsoTemplate.java @@ -382,7 +382,7 @@ public class SaSsoTemplate { */ public Object getUserinfo(Object loginId) { String url = buildUserinfoUrl(loginId); - return SaManager.getConfig().getSso().sendHttp.apply(url); + return SaManager.getConfig().getSso().getSendHttp().apply(url); } diff --git a/sa-token-demo/sa-token-demo-oauth2-server/src/main/resources/application.yml b/sa-token-demo/sa-token-demo-oauth2-server/src/main/resources/application.yml index 6909289f..8591934d 100644 --- a/sa-token-demo/sa-token-demo-oauth2-server/src/main/resources/application.yml +++ b/sa-token-demo/sa-token-demo-oauth2-server/src/main/resources/application.yml @@ -35,7 +35,7 @@ spring: max-idle: 10 # 连接池中的最小空闲连接 min-idle: 0 - + password: 123456 \ No newline at end of file diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/config/SaOAuth2Config.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/config/SaOAuth2Config.java index 1f6198b2..f9464bd7 100644 --- a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/config/SaOAuth2Config.java +++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/config/SaOAuth2Config.java @@ -223,6 +223,13 @@ public class SaOAuth2Config implements Serializable { return this; } + /** + * @return 函数 OAuth-Server端:未登录时返回的View + */ + public Supplier getNotLoginView() { + return notLoginView; + } + /** * @param confirmView OAuth-Server端:确认授权时返回的View * @return 对象自身 @@ -231,7 +238,14 @@ public class SaOAuth2Config implements Serializable { this.confirmView = confirmView; return this; } - + + /** + * @return 函数 OAuth-Server端:确认授权时返回的View + */ + public BiFunction getConfirmView() { + return confirmView; + } + /** * @param doLoginHandle OAuth-Server端:登录函数 * @return 对象自身 @@ -241,7 +255,13 @@ public class SaOAuth2Config implements Serializable { return this; } - + /** + * @return 函数 OAuth-Server端:登录函数 + */ + public BiFunction getDoLoginHandle() { + return doLoginHandle; + } + @Override public String toString() { return "SaOAuth2Config [isCode=" + isCode + ", isImplicit=" + isImplicit + ", isPassword=" + isPassword diff --git a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/logic/SaOAuth2Handle.java b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/logic/SaOAuth2Handle.java index e1a9684a..763e39fc 100644 --- a/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/logic/SaOAuth2Handle.java +++ b/sa-token-plugin/sa-token-oauth2/src/main/java/cn/dev33/satoken/oauth2/logic/SaOAuth2Handle.java @@ -41,7 +41,7 @@ public class SaOAuth2Handle { // 模式一:Code授权码 if(req.isPath(Api.authorize) && req.isParam(Param.response_type, ResponseType.code)) { SaClientModel cm = currClientModel(); - if(cfg.isCode && (cm.isCode || cm.isAutoMode)) { + if(cfg.getIsCode() && (cm.isCode || cm.isAutoMode)) { return authorize(req, res, cfg); } throw new SaOAuth2Exception("暂未开放的授权模式"); @@ -75,7 +75,7 @@ public class SaOAuth2Handle { // 模式二:隐藏式 if(req.isPath(Api.authorize) && req.isParam(Param.response_type, ResponseType.token)) { SaClientModel cm = currClientModel(); - if(cfg.isImplicit && (cm.isImplicit || cm.isAutoMode)) { + if(cfg.getIsImplicit() && (cm.isImplicit || cm.isAutoMode)) { return authorize(req, res, cfg); } throw new SaOAuth2Exception("暂未开放的授权模式"); @@ -84,7 +84,7 @@ public class SaOAuth2Handle { // 模式三:密码式 if(req.isPath(Api.token) && req.isParam(Param.grant_type, GrantType.password)) { SaClientModel cm = currClientModel(); - if(cfg.isPassword && (cm.isPassword || cm.isAutoMode)) { + if(cfg.getIsPassword() && (cm.isPassword || cm.isAutoMode)) { return password(req, res, cfg); } throw new SaOAuth2Exception("暂未开放的授权模式"); @@ -93,7 +93,7 @@ public class SaOAuth2Handle { // 模式四:凭证式 if(req.isPath(Api.client_token) && req.isParam(Param.grant_type, GrantType.client_credentials)) { SaClientModel cm = currClientModel(); - if(cfg.isClient && (cm.isClient || cm.isAutoMode)) { + if(cfg.getIsClient() && (cm.isClient || cm.isAutoMode)) { return clientToken(req, res, cfg); } throw new SaOAuth2Exception("暂未开放的授权模式"); @@ -114,7 +114,7 @@ public class SaOAuth2Handle { // 1、如果尚未登录, 则先去登录 if(StpUtil.isLogin() == false) { - return cfg.notLoginView.get(); + return cfg.getNotLoginView().get(); } // 2、构建请求Model @@ -129,7 +129,7 @@ public class SaOAuth2Handle { // 5、判断:如果此次申请的Scope,该用户尚未授权,则转到授权页面 boolean isGrant = SaOAuth2Util.isGrant(ra.loginId, ra.clientId, ra.scope); if(isGrant == false) { - return cfg.confirmView.apply(ra.clientId, ra.scope); + return cfg.getConfirmView().apply(ra.clientId, ra.scope); } // 6、判断授权类型 @@ -226,7 +226,7 @@ public class SaOAuth2Handle { * @return 处理结果 */ public static Object doLogin(SaRequest req, SaResponse res, SaOAuth2Config cfg) { - return cfg.doLoginHandle.apply(req.getParamNotNull(Param.name), req.getParamNotNull("pwd")); + return cfg.getDoLoginHandle().apply(req.getParamNotNull(Param.name), req.getParamNotNull("pwd")); } /** @@ -264,7 +264,7 @@ public class SaOAuth2Handle { SaHolder.getStorage().set(StpUtil.stpLogic.splicingKeyJustCreatedSave(), "no-token"); // 4、调用API 开始登录,如果没能成功登录,则直接退出 - Object retObj = cfg.doLoginHandle.apply(username, password); + Object retObj = cfg.getDoLoginHandle().apply(username, password); if(StpUtil.isLogin() == false) { return retObj; }