sso,oauth2插件中调用配置类使用getter方法

This commit is contained in:
naah69
2022-04-14 11:24:03 +08:00
parent 88d88198f1
commit 9de31236c6
6 changed files with 79 additions and 33 deletions

View File

@@ -305,6 +305,13 @@ public class SaSsoConfig implements Serializable {
return this; return this;
} }
/**
* @return 函数 SSO-Server端未登录时返回的View
*/
public Supplier<Object> getNotLoginView() {
return notLoginView;
}
/** /**
* @param doLoginHandle SSO-Server端登录函数 * @param doLoginHandle SSO-Server端登录函数
* @return 对象自身 * @return 对象自身
@@ -314,6 +321,13 @@ public class SaSsoConfig implements Serializable {
return this; return this;
} }
/**
* @return 函数 SSO-Server端登录函数
*/
public BiFunction<String, String, Object> getDoLoginHandle() {
return doLoginHandle;
}
/** /**
* @param ticketResultHandle SSO-Client端自定义校验Ticket返回值的处理逻辑 每次从认证中心获取校验Ticket的结果后调用 * @param ticketResultHandle SSO-Client端自定义校验Ticket返回值的处理逻辑 每次从认证中心获取校验Ticket的结果后调用
* @return 对象自身 * @return 对象自身
@@ -323,6 +337,13 @@ public class SaSsoConfig implements Serializable {
return this; return this;
} }
/**
* @return 函数 SSO-Client端自定义校验Ticket返回值的处理逻辑 每次从认证中心获取校验Ticket的结果后调用
*/
public BiFunction<Object, String, Object> getTicketResultHandle() {
return ticketResultHandle;
}
/** /**
* @param sendHttp SSO-Client端发送Http请求的处理函数 * @param sendHttp SSO-Client端发送Http请求的处理函数
* @return 对象自身 * @return 对象自身
@@ -332,7 +353,12 @@ public class SaSsoConfig implements Serializable {
return this; return this;
} }
/**
* @return 函数 SSO-Client端发送Http请求的处理函数
*/
public Function<String, Object> getSendHttp() {
return sendHttp;
}
} }

View File

@@ -42,17 +42,17 @@ public class SaSsoHandle {
} }
// SSO-Server端校验ticket 获取账号id // SSO-Server端校验ticket 获取账号id
if(req.isPath(Api.ssoCheckTicket) && cfg.isHttp) { if(req.isPath(Api.ssoCheckTicket) && cfg.getIsHttp()) {
return ssoCheckTicket(); return ssoCheckTicket();
} }
// SSO-Server端单点注销 [模式一] (不带loginId参数) // 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(); return ssoServerLogoutType1();
} }
// SSO-Server端单点注销 [模式三] (带loginId参数) // 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(); return ssoServerLogout();
} }
@@ -74,7 +74,7 @@ public class SaSsoHandle {
// ---------- 此处有两种情况分开处理: // ---------- 此处有两种情况分开处理:
// ---- 情况1在SSO认证中心尚未登录需要先去登录 // ---- 情况1在SSO认证中心尚未登录需要先去登录
if(stpLogic.isLogin() == false) { if(stpLogic.isLogin() == false) {
return cfg.notLoginView.get(); return cfg.getNotLoginView().get();
} }
// ---- 情况2在SSO认证中心已经登录需要重定向回 Client 端,而这又分为两种方式: // ---- 情况2在SSO认证中心已经登录需要重定向回 Client 端,而这又分为两种方式:
String mode = req.getParam(ParamName.mode, ""); String mode = req.getParam(ParamName.mode, "");
@@ -101,7 +101,7 @@ public class SaSsoHandle {
SaSsoConfig cfg = SaManager.getConfig().getSso(); 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); SaSsoUtil.checkSecretkey(secretkey);
// step.2 遍历通知Client端注销会话 // step.2 遍历通知Client端注销会话
SaSsoUtil.forEachSloUrl(loginId, url -> cfg.sendHttp.apply(url)); SaSsoUtil.forEachSloUrl(loginId, url -> cfg.getSendHttp().apply(url));
// step.3 Server端注销 // step.3 Server端注销
stpLogic.logout(loginId); stpLogic.logout(loginId);
@@ -190,17 +190,17 @@ public class SaSsoHandle {
} }
// ---------- SSO-Client端单点注销 [模式二] // ---------- SSO-Client端单点注销 [模式二]
if(req.isPath(Api.ssoLogout) && cfg.isSlo && cfg.isHttp == false) { if(req.isPath(Api.ssoLogout) && cfg.getIsSlo() && cfg.getIsHttp() == false) {
return ssoLogoutType2(); return ssoLogoutType2();
} }
// ---------- SSO-Client端单点注销 [模式三] // ---------- SSO-Client端单点注销 [模式三]
if(req.isPath(Api.ssoLogout) && cfg.isSlo && cfg.isHttp) { if(req.isPath(Api.ssoLogout) && cfg.getIsSlo() && cfg.getIsHttp()) {
return ssoLogoutType3(); return ssoLogoutType3();
} }
// ---------- SSO-Client端单点注销的回调 [模式三] // ---------- SSO-Client端单点注销的回调 [模式三]
if(req.isPath(Api.ssoLogoutCall) && cfg.isSlo && cfg.isHttp) { if(req.isPath(Api.ssoLogoutCall) && cfg.getIsSlo() && cfg.getIsHttp()) {
return ssoLogoutCall(); return ssoLogoutCall();
} }
@@ -240,8 +240,8 @@ public class SaSsoHandle {
Object loginId = checkTicket(ticket, Api.ssoLogin); Object loginId = checkTicket(ticket, Api.ssoLogin);
// Be: 如果开发者自定义了处理逻辑 // Be: 如果开发者自定义了处理逻辑
if(cfg.ticketResultHandle != null) { if(cfg.getTicketResultHandle() != null) {
return cfg.ticketResultHandle.apply(loginId, back); return cfg.getTicketResultHandle().apply(loginId, back);
} }
// ------- 2、如果loginId有值说明ticket有效进行登录并重定向至back地址 // ------- 2、如果loginId有值说明ticket有效进行登录并重定向至back地址
if(loginId != null ) { if(loginId != null ) {
@@ -289,7 +289,7 @@ public class SaSsoHandle {
// 调用SSO-Server认证中心API进行注销 // 调用SSO-Server认证中心API进行注销
String url = SaSsoUtil.buildSloUrl(stpLogic.getLoginId()); 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) { if(SaSsoConsts.OK.equals(body) == false) {
return SaResult.error("单点注销失败"); return SaResult.error("单点注销失败");
} }
@@ -349,14 +349,14 @@ public class SaSsoHandle {
public static Object checkTicket(String ticket, String currUri) { public static Object checkTicket(String ticket, String currUri) {
SaSsoConfig cfg = SaManager.getConfig().getSso(); SaSsoConfig cfg = SaManager.getConfig().getSso();
// --------- 两种模式 // --------- 两种模式
if(cfg.isHttp) { if(cfg.getIsHttp()) {
// 模式三使用http请求校验ticket // 模式三使用http请求校验ticket
String ssoLogoutCall = null; String ssoLogoutCall = null;
if(cfg.isSlo) { if(cfg.getIsSlo()) {
ssoLogoutCall = SaHolder.getRequest().getUrl().replace(currUri, Api.ssoLogoutCall); ssoLogoutCall = SaHolder.getRequest().getUrl().replace(currUri, Api.ssoLogoutCall);
} }
String checkUrl = SaSsoUtil.buildCheckTicketUrl(ticket, 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); return (SaFoxUtil.isEmpty(body) ? null : body);
} else { } else {
// 模式二直连Redis校验ticket // 模式二直连Redis校验ticket

View File

@@ -382,7 +382,7 @@ public class SaSsoTemplate {
*/ */
public Object getUserinfo(Object loginId) { public Object getUserinfo(Object loginId) {
String url = buildUserinfoUrl(loginId); String url = buildUserinfoUrl(loginId);
return SaManager.getConfig().getSso().sendHttp.apply(url); return SaManager.getConfig().getSso().getSendHttp().apply(url);
} }

View File

@@ -16,11 +16,11 @@ spring:
# redis配置 # redis配置
redis: redis:
# Redis数据库索引默认为0 # Redis数据库索引默认为0
database: 1 database: 15
# Redis服务器地址 # Redis服务器地址
host: 127.0.0.1 host: 192.168.101.202
# Redis服务器连接端口 # Redis服务器连接端口
port: 6379 port: 30068
# Redis服务器连接密码默认为空 # Redis服务器连接密码默认为空
# password: # password:
# 连接超时时间(毫秒) # 连接超时时间(毫秒)
@@ -35,7 +35,7 @@ spring:
max-idle: 10 max-idle: 10
# 连接池中的最小空闲连接 # 连接池中的最小空闲连接
min-idle: 0 min-idle: 0
password: 123456

View File

@@ -223,6 +223,13 @@ public class SaOAuth2Config implements Serializable {
return this; return this;
} }
/**
* @return 函数 OAuth-Server端未登录时返回的View
*/
public Supplier<Object> getNotLoginView() {
return notLoginView;
}
/** /**
* @param confirmView OAuth-Server端确认授权时返回的View * @param confirmView OAuth-Server端确认授权时返回的View
* @return 对象自身 * @return 对象自身
@@ -232,6 +239,13 @@ public class SaOAuth2Config implements Serializable {
return this; return this;
} }
/**
* @return 函数 OAuth-Server端确认授权时返回的View
*/
public BiFunction<String, String, Object> getConfirmView() {
return confirmView;
}
/** /**
* @param doLoginHandle OAuth-Server端登录函数 * @param doLoginHandle OAuth-Server端登录函数
* @return 对象自身 * @return 对象自身
@@ -241,6 +255,12 @@ public class SaOAuth2Config implements Serializable {
return this; return this;
} }
/**
* @return 函数 OAuth-Server端登录函数
*/
public BiFunction<String, String, Object> getDoLoginHandle() {
return doLoginHandle;
}
@Override @Override
public String toString() { public String toString() {

View File

@@ -41,7 +41,7 @@ public class SaOAuth2Handle {
// 模式一Code授权码 // 模式一Code授权码
if(req.isPath(Api.authorize) && req.isParam(Param.response_type, ResponseType.code)) { if(req.isPath(Api.authorize) && req.isParam(Param.response_type, ResponseType.code)) {
SaClientModel cm = currClientModel(); SaClientModel cm = currClientModel();
if(cfg.isCode && (cm.isCode || cm.isAutoMode)) { if(cfg.getIsCode() && (cm.isCode || cm.isAutoMode)) {
return authorize(req, res, cfg); return authorize(req, res, cfg);
} }
throw new SaOAuth2Exception("暂未开放的授权模式"); throw new SaOAuth2Exception("暂未开放的授权模式");
@@ -75,7 +75,7 @@ public class SaOAuth2Handle {
// 模式二:隐藏式 // 模式二:隐藏式
if(req.isPath(Api.authorize) && req.isParam(Param.response_type, ResponseType.token)) { if(req.isPath(Api.authorize) && req.isParam(Param.response_type, ResponseType.token)) {
SaClientModel cm = currClientModel(); SaClientModel cm = currClientModel();
if(cfg.isImplicit && (cm.isImplicit || cm.isAutoMode)) { if(cfg.getIsImplicit() && (cm.isImplicit || cm.isAutoMode)) {
return authorize(req, res, cfg); return authorize(req, res, cfg);
} }
throw new SaOAuth2Exception("暂未开放的授权模式"); throw new SaOAuth2Exception("暂未开放的授权模式");
@@ -84,7 +84,7 @@ public class SaOAuth2Handle {
// 模式三:密码式 // 模式三:密码式
if(req.isPath(Api.token) && req.isParam(Param.grant_type, GrantType.password)) { if(req.isPath(Api.token) && req.isParam(Param.grant_type, GrantType.password)) {
SaClientModel cm = currClientModel(); SaClientModel cm = currClientModel();
if(cfg.isPassword && (cm.isPassword || cm.isAutoMode)) { if(cfg.getIsPassword() && (cm.isPassword || cm.isAutoMode)) {
return password(req, res, cfg); return password(req, res, cfg);
} }
throw new SaOAuth2Exception("暂未开放的授权模式"); throw new SaOAuth2Exception("暂未开放的授权模式");
@@ -93,7 +93,7 @@ public class SaOAuth2Handle {
// 模式四:凭证式 // 模式四:凭证式
if(req.isPath(Api.client_token) && req.isParam(Param.grant_type, GrantType.client_credentials)) { if(req.isPath(Api.client_token) && req.isParam(Param.grant_type, GrantType.client_credentials)) {
SaClientModel cm = currClientModel(); SaClientModel cm = currClientModel();
if(cfg.isClient && (cm.isClient || cm.isAutoMode)) { if(cfg.getIsClient() && (cm.isClient || cm.isAutoMode)) {
return clientToken(req, res, cfg); return clientToken(req, res, cfg);
} }
throw new SaOAuth2Exception("暂未开放的授权模式"); throw new SaOAuth2Exception("暂未开放的授权模式");
@@ -114,7 +114,7 @@ public class SaOAuth2Handle {
// 1、如果尚未登录, 则先去登录 // 1、如果尚未登录, 则先去登录
if(StpUtil.isLogin() == false) { if(StpUtil.isLogin() == false) {
return cfg.notLoginView.get(); return cfg.getNotLoginView().get();
} }
// 2、构建请求Model // 2、构建请求Model
@@ -129,7 +129,7 @@ public class SaOAuth2Handle {
// 5、判断如果此次申请的Scope该用户尚未授权则转到授权页面 // 5、判断如果此次申请的Scope该用户尚未授权则转到授权页面
boolean isGrant = SaOAuth2Util.isGrant(ra.loginId, ra.clientId, ra.scope); boolean isGrant = SaOAuth2Util.isGrant(ra.loginId, ra.clientId, ra.scope);
if(isGrant == false) { if(isGrant == false) {
return cfg.confirmView.apply(ra.clientId, ra.scope); return cfg.getConfirmView().apply(ra.clientId, ra.scope);
} }
// 6、判断授权类型 // 6、判断授权类型
@@ -226,7 +226,7 @@ public class SaOAuth2Handle {
* @return 处理结果 * @return 处理结果
*/ */
public static Object doLogin(SaRequest req, SaResponse res, SaOAuth2Config cfg) { 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"); SaHolder.getStorage().set(StpUtil.stpLogic.splicingKeyJustCreatedSave(), "no-token");
// 4、调用API 开始登录,如果没能成功登录,则直接退出 // 4、调用API 开始登录,如果没能成功登录,则直接退出
Object retObj = cfg.doLoginHandle.apply(username, password); Object retObj = cfg.getDoLoginHandle().apply(username, password);
if(StpUtil.isLogin() == false) { if(StpUtil.isLogin() == false) {
return retObj; return retObj;
} }