1
0
mirror of synced 2026-05-22 14:43:15 +00:00

升级优化一下 solon 相关集成 demo

This commit is contained in:
click33
2024-05-11 15:37:02 +08:00
parent 26bf2bd478
commit 54114ebac6
19 changed files with 230 additions and 88 deletions
+1 -1
View File
@@ -40,7 +40,7 @@
<artifactId>sa-token-solon-plugin</artifactId> <artifactId>sa-token-solon-plugin</artifactId>
<version>${sa-token.version}</version> <version>${sa-token.version}</version>
</dependency> </dependency>
<!-- sa-token整合redis (使用jdk默认序列化方式) --> <!-- sa-token整合redis (使用jdk默认序列化方式) -->
<dependency> <dependency>
<groupId>cn.dev33</groupId> <groupId>cn.dev33</groupId>
@@ -2,6 +2,8 @@ package com.pj;
import cn.dev33.satoken.SaManager; import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.StpUtil;
import org.noear.solon.Solon; import org.noear.solon.Solon;
import org.noear.solon.annotation.SolonMain; import org.noear.solon.annotation.SolonMain;
@@ -16,5 +18,13 @@ public class SaTokenDemoApp {
public static void main(String[] args) { public static void main(String[] args) {
Solon.start(SaTokenDemoApp.class, args); Solon.start(SaTokenDemoApp.class, args);
System.out.println("\n启动成功:Sa-Token配置如下:" + SaManager.getConfig()); System.out.println("\n启动成功:Sa-Token配置如下:" + SaManager.getConfig());
SaSession session = StpUtil.getSessionByLoginId(10001);
session.set("name", "zhang");
session.set("user", new SysUser(10001, "张三"));
session = StpUtil.getSessionByLoginId(10001);
System.out.println(session.get("name"));
System.out.println(session.get("user"));
} }
} }
@@ -0,0 +1,64 @@
package com.pj;
/**
* @author click33
* @since 2024/5/11
*/
public class SysUser {
public int id;
public String name;
public SysUser() {
}
public SysUser(int id, String name) {
this.id = id;
this.name = name;
}
/**
* 获取
*
* @return id
*/
public int getId() {
return this.id;
}
/**
* 设置
*
* @param id
*/
public void setId(int id) {
this.id = id;
}
/**
* 获取
*
* @return name
*/
public String getName() {
return this.name;
}
/**
* 设置
*
* @param name
*/
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "SysUser{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
@@ -1,15 +1,13 @@
package com.pj.satoken; package com.pj.satoken;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.dao.SaTokenDaoOfRedis; import cn.dev33.satoken.dao.SaTokenDaoOfRedis;
import cn.dev33.satoken.solon.integration.SaTokenInterceptor; import cn.dev33.satoken.solon.integration.SaTokenInterceptor;
import com.pj.util.AjaxJson;
import org.noear.solon.annotation.Bean; import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration; import org.noear.solon.annotation.Configuration;
import com.pj.util.AjaxJson;
import cn.dev33.satoken.context.SaHolder;
import org.noear.solon.annotation.Inject; import org.noear.solon.annotation.Inject;
@@ -59,9 +57,11 @@ public class SaTokenConfigure {
; ;
}); });
} }
//如果需要 redis dao,加这段代表
// @Bean //如果需要 redis dao,加这段代表
// public SaTokenDao saTokenDaoInit(@Inject("${sa-token-dao.redis}") SaTokenDaoOfRedis saTokenDao) { @Bean
// return saTokenDao; public SaTokenDao saTokenDaoInit(@Inject("${sa-token-dao.redis}") SaTokenDaoOfRedis saTokenDao) {
// } return saTokenDao;
}
} }
@@ -17,6 +17,7 @@
<!-- 定义 Sa-Token 版本号 --> <!-- 定义 Sa-Token 版本号 -->
<properties> <properties>
<sa-token.version>1.38.0</sa-token.version> <sa-token.version>1.38.0</sa-token.version>
<solon.version>2.7.0</solon.version>
</properties> </properties>
<dependencies> <dependencies>
@@ -48,7 +49,7 @@
<artifactId>sa-token-redisx</artifactId> <artifactId>sa-token-redisx</artifactId>
<version>${sa-token.version}</version> <version>${sa-token.version}</version>
</dependency> </dependency>
<!-- 视图引擎(在前后端不分离模式下提供视图支持) --> <!-- 视图引擎(在前后端不分离模式下提供视图支持) -->
<dependency> <dependency>
<groupId>org.noear</groupId> <groupId>org.noear</groupId>
@@ -1,6 +1,7 @@
package com.pj; package com.pj;
import cn.dev33.satoken.sso.SaSsoManager;
import org.noear.solon.Solon; import org.noear.solon.Solon;
import org.noear.solon.annotation.SolonMain; import org.noear.solon.annotation.SolonMain;
@@ -9,7 +10,13 @@ public class SaSsoServerApp {
public static void main(String[] args) { public static void main(String[] args) {
Solon.start(SaSsoServerApp.class, args); Solon.start(SaSsoServerApp.class, args);
System.out.println("\n------ Sa-Token-SSO 统一认证中心启动成功 ");
System.out.println();
System.out.println("---------------------- Solon Sa-Token SSO 统一认证中心启动成功 ----------------------");
System.out.println("配置信息:" + SaSsoManager.getServerConfig());
System.out.println("统一认证登录地址:http://sa-sso-server.com:9000/sso/auth");
System.out.println("测试前需要根据官网文档修改hosts文件,测试账号密码:sa / 123456");
System.out.println();
} }
} }
@@ -44,12 +44,13 @@ public class SsoConfig {
return SaResult.error("登录失败!"); return SaResult.error("登录失败!");
}; };
// 配置 Http 请求处理器 (在模式三的单点注销功能下用到,如不需要可以注释掉) // 配置 Http 请求处理器
ssoServer.sendHttp = url -> { ssoServer.sendHttp = url -> {
try { try {
// 发起 http 请求
System.out.println("------ 发起请求:" + url); System.out.println("------ 发起请求:" + url);
return Forest.get(url).executeAsString(); String resStr = Forest.get(url).executeAsString();
System.out.println("------ 请求结果:" + resStr);
return resStr;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return null; return null;
@@ -29,7 +29,7 @@ sa-token:
sa-token.dao: #名字可以随意取 sa-token.dao: #名字可以随意取
redis: redis:
server: "localhost:6379" server: "localhost:6379"
password: 123456 # password: 123456
db: 1 db: 1
maxTotal: 200 maxTotal: 200
@@ -1,6 +1,7 @@
package com.pj; package com.pj;
import cn.dev33.satoken.sso.SaSsoManager;
import org.noear.solon.Solon; import org.noear.solon.Solon;
import org.noear.solon.annotation.SolonMain; import org.noear.solon.annotation.SolonMain;
@@ -15,6 +16,15 @@ public class SaSso1ClientApp {
public static void main(String[] args) { public static void main(String[] args) {
Solon.start(SaSso1ClientApp.class, args); Solon.start(SaSso1ClientApp.class, args);
System.out.println("\nSa-Token SSO模式一 Client端启动成功"); System.out.println("\nSa-Token SSO模式一 Client端启动成功");
System.out.println();
System.out.println("---------------------- Solon Sa-Token SSO 模式一 Client 端启动成功 ----------------------");
System.out.println("配置信息:" + SaSsoManager.getClientConfig());
System.out.println("测试访问应用端一: http://s1.stp.com:9001");
System.out.println("测试访问应用端二: http://s2.stp.com:9001");
System.out.println("测试访问应用端三: http://s3.stp.com:9001");
System.out.println("测试前需要根据官网文档修改hosts文件,测试账号密码:sa / 123456");
System.out.println();
} }
} }
@@ -6,16 +6,14 @@ server:
sa-token: sa-token:
# SSO-相关配置 # SSO-相关配置
sso-client: sso-client:
# SSO-Server端-单点登录授权地址 # SSO-Server端 - 主机地址
auth-url: http://sso.stp.com:9000/sso/auth server-url: http://sso.stp.com:9000
# SSO-Server端-单点注销地址
slo-url: http://sso.stp.com:9000/sso/signout
# 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis # 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis
sa-token.dao: #名字可以随意取 sa-token.dao: #名字可以随意取
redis: redis:
server: "localhost:6379" server: "localhost:6379"
password: 123456 # password: 123456
db: 1 db: 1
maxTotal: 200 maxTotal: 200
@@ -47,6 +47,13 @@
<artifactId>sa-token-redisx</artifactId> <artifactId>sa-token-redisx</artifactId>
<version>${sa-token.version}</version> <version>${sa-token.version}</version>
</dependency> </dependency>
<!-- Http 请求工具 -->
<dependency>
<groupId>org.noear</groupId>
<artifactId>forest-solon-plugin</artifactId>
</dependency>
</dependencies> </dependencies>
@@ -2,8 +2,11 @@ package com.pj;
import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.dao.SaTokenDaoOfRedis; import cn.dev33.satoken.dao.SaTokenDaoOfRedis;
import cn.dev33.satoken.sso.config.SaSsoClientConfig;
import com.dtflys.forest.Forest;
import org.noear.solon.annotation.Bean; import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Configuration; import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Init;
import org.noear.solon.annotation.Inject; import org.noear.solon.annotation.Inject;
/** /**
@@ -19,4 +22,16 @@ public class SaConfig {
public SaTokenDao saTokenDaoInit(@Inject("${sa-token.dao.redis}") SaTokenDaoOfRedis saTokenDao) { public SaTokenDao saTokenDaoInit(@Inject("${sa-token.dao.redis}") SaTokenDaoOfRedis saTokenDao) {
return saTokenDao; return saTokenDao;
} }
@Bean
public void configSso(SaSsoClientConfig ssoClient) {
// 配置Http请求处理器
ssoClient.sendHttp = url -> {
System.out.println("------ 发起请求:" + url);
String resStr = Forest.get(url).executeAsString();
System.out.println("------ 请求结果:" + resStr);
return resStr;
};
}
} }
@@ -1,6 +1,7 @@
package com.pj; package com.pj;
import cn.dev33.satoken.sso.SaSsoManager;
import org.noear.solon.Solon; import org.noear.solon.Solon;
import org.noear.solon.annotation.SolonMain; import org.noear.solon.annotation.SolonMain;
@@ -9,7 +10,15 @@ public class SaSso2ClientApp {
public static void main(String[] args) { public static void main(String[] args) {
Solon.start(SaSso2ClientApp.class, args); Solon.start(SaSso2ClientApp.class, args);
System.out.println("\nSa-Token SSO模式二 Client端启动成功");
System.out.println();
System.out.println("---------------------- Solon Sa-Token SSO 模式二 Client 端启动成功 ----------------------");
System.out.println("配置信息:" + SaSsoManager.getClientConfig());
System.out.println("测试访问应用端一: http://sa-sso-client1.com:9002");
System.out.println("测试访问应用端二: http://sa-sso-client2.com:9002");
System.out.println("测试访问应用端三: http://sa-sso-client3.com:9002");
System.out.println("测试前需要根据官网文档修改hosts文件,测试账号密码:sa / 123456");
System.out.println();
} }
} }
@@ -6,17 +6,20 @@ server:
sa-token: sa-token:
# SSO-相关配置 # SSO-相关配置
sso-client: sso-client:
# SSO-Server端 统一认证地址 # SSO-Server端 主机地址
auth-url: http://sa-sso-server.com:9000/sso/auth server-url: http://sa-sso-server.com:9000
# auth-url: http://127.0.0.1:8848/sa-token-demo-sso-server-h5/sso-auth.html # auth-url: http://127.0.0.1:8848/sa-token-demo-sso-server-h5/sso-auth.html
# 是否打开单点注销接口 # 是否打开单点注销接口
is-slo: true is-slo: true
sign:
# API 接口调用秘钥
secret-key: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor
# 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis # 配置 Sa-Token 单独使用的Redis连接 (此处需要和SSO-Server端连接同一个Redis
sa-token.dao: #名字可以随意取 sa-token.dao: #名字可以随意取
redis: redis:
server: "localhost:6379" server: "localhost:6379"
password: 123456 # password: 123456
db: 1 db: 1
maxTotal: 200 maxTotal: 200
@@ -1,5 +1,6 @@
package com.pj; package com.pj;
import cn.dev33.satoken.sso.SaSsoManager;
import org.noear.solon.Solon; import org.noear.solon.Solon;
import org.noear.solon.annotation.SolonMain; import org.noear.solon.annotation.SolonMain;
@@ -8,7 +9,15 @@ public class SaSso3ClientApp {
public static void main(String[] args) { public static void main(String[] args) {
Solon.start(SaSso3ClientApp.class, args); Solon.start(SaSso3ClientApp.class, args);
System.out.println("\nSa-Token SSO模式三 Client端启动成功");
System.out.println();
System.out.println("---------------------- Sa-Token SSO 模式三 Client 端启动成功 ----------------------");
System.out.println("配置信息:" + SaSsoManager.getClientConfig());
System.out.println("测试访问应用端一: http://sa-sso-client1.com:9003");
System.out.println("测试访问应用端二: http://sa-sso-client2.com:9003");
System.out.println("测试访问应用端三: http://sa-sso-client3.com:9003");
System.out.println("测试前需要根据官网文档修改hosts文件,测试账号密码:sa / 123456");
System.out.println();
} }
} }
@@ -1,50 +1,50 @@
package com.pj.sso; //package com.pj.sso;
//
import cn.dev33.satoken.sso.SaSsoManager; //import cn.dev33.satoken.sso.SaSsoManager;
import cn.dev33.satoken.sso.config.SaSsoClientConfig; //import cn.dev33.satoken.sso.config.SaSsoClientConfig;
import cn.dev33.satoken.sso.processor.SaSsoClientProcessor; //import cn.dev33.satoken.sso.processor.SaSsoClientProcessor;
import cn.dev33.satoken.sso.template.SaSsoClientTemplate; //import cn.dev33.satoken.sso.template.SaSsoClientTemplate;
import org.noear.solon.annotation.Bean; //import org.noear.solon.annotation.Bean;
import org.noear.solon.annotation.Condition; //import org.noear.solon.annotation.Condition;
import org.noear.solon.annotation.Configuration; //import org.noear.solon.annotation.Configuration;
import org.noear.solon.annotation.Inject; //import org.noear.solon.annotation.Inject;
//
/** ///**
* solon 的 sso 适配,在 cn.dev33:sa-token-solon-plugin:1.34.0 里还没有。(临时加这个类) // * solon 的 sso 适配,在 cn.dev33:sa-token-solon-plugin:1.34.0 里还没有。(临时加这个类)
* // *
* //todo: 如果使用 org.noear:sa-token-solon-plugin:xxx ,则需要删掉这个类 // * //todo: 如果使用 org.noear:sa-token-solon-plugin:xxx ,则需要删掉这个类
* // *
* @author noear // * @author noear
* @since 2.0 // * @since 2.0
*/ // */
@Condition(onClass = SaSsoManager.class) //@Condition(onClass = SaSsoManager.class)
@Configuration //@Configuration
public class SaSsoAutoConfigure { //public class SaSsoAutoConfigure {
/** // /**
* 获取 SSO 配置Bean // * 获取 SSO 配置Bean
* */ // * */
@Bean // @Bean
public SaSsoClientConfig getConfig(@Inject(value = "${sa-token.sso-client}",required = false) SaSsoClientConfig ssoConfig) { // public SaSsoClientConfig getConfig(@Inject(value = "${sa-token.sso-client}",required = false) SaSsoClientConfig ssoConfig) {
return ssoConfig; // return ssoConfig;
} // }
//
/** // /**
* 注入 Sa-Token-SSO 配置Bean // * 注入 Sa-Token-SSO 配置Bean
* // *
* @param saSsoConfig 配置对象 // * @param saSsoConfig 配置对象
*/ // */
@Bean // @Bean
public void setSaSsoConfig(@Inject(required = false) SaSsoClientConfig saSsoConfig) { // public void setSaSsoConfig(@Inject(required = false) SaSsoClientConfig saSsoConfig) {
SaSsoManager.setClientConfig(saSsoConfig); // SaSsoManager.setClientConfig(saSsoConfig);
} // }
//
/** // /**
* 注入 Sa-Token-SSO 单点登录模块 Bean // * 注入 Sa-Token-SSO 单点登录模块 Bean
* // *
* @param ssoClientTemplate ssoClientTemplate对象 // * @param ssoClientTemplate ssoClientTemplate对象
*/ // */
@Bean // @Bean
public void setSaSsoClientTemplate(@Inject(required = false) SaSsoClientTemplate ssoClientTemplate) { // public void setSaSsoClientTemplate(@Inject(required = false) SaSsoClientTemplate ssoClientTemplate) {
SaSsoClientProcessor.instance.ssoClientTemplate = ssoClientTemplate; // SaSsoClientProcessor.instance.ssoClientTemplate = ssoClientTemplate;
} // }
} //}
@@ -16,7 +16,9 @@ public class SsoConfig {
// 配置Http请求处理器 // 配置Http请求处理器
ssoClient.sendHttp = url -> { ssoClient.sendHttp = url -> {
System.out.println("------ 发起请求:" + url); System.out.println("------ 发起请求:" + url);
return Forest.get(url).executeAsString(); String resStr = Forest.get(url).executeAsString();
System.out.println("------ 请求结果:" + resStr);
return resStr;
}; };
} }
} }
@@ -6,27 +6,22 @@ server:
sa-token: sa-token:
# SSO-相关配置 # SSO-相关配置
sso-client: sso-client:
# SSO-Server端 统一认证地址 # SSO-Server端 主机地址
auth-url: http://sa-sso-server.com:9000/sso/auth server-url: http://sa-sso-server.com:9000
# 使用Http请求校验ticket # 使用Http请求校验ticket
is-http: true is-http: true
# SSO-Server端 ticket校验地址
check-ticket-url: http://sa-sso-server.com:9000/sso/checkTicket
# 打开单点注销功能 # 打开单点注销功能
is-slo: true is-slo: true
# 单点注销地址 sign:
slo-url: http://sa-sso-server.com:9000/sso/signout
# 接口调用秘钥 # 接口调用秘钥
secretkey: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor secret-key: kQwIOrYvnXmSDkwEiFngrKidMcdrgKor
# SSO-Server端 查询userinfo地址
userinfo-url: http://sa-sso-server.com:9000/sso/userinfo
# 配置 Sa-Token Dao(此处与SSO-Server端连接不同的Redis # 配置 Sa-Token Dao(此处与SSO-Server端连接不同的Redis
sa-token.dao: #名字可以随意取 sa-token.dao: #名字可以随意取
redis: redis:
server: "localhost:6379" server: "localhost:6379"
password: 123456 # password: 123456
db: 2 db: 2
maxTotal: 200 maxTotal: 200
@@ -21,12 +21,15 @@ import cn.dev33.satoken.httpauth.basic.SaHttpBasicUtil;
import cn.dev33.satoken.config.SaTokenConfig; import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.context.second.SaTokenSecondContextCreator; import cn.dev33.satoken.context.second.SaTokenSecondContextCreator;
import cn.dev33.satoken.dao.SaTokenDao; import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.httpauth.digest.SaHttpDigestTemplate;
import cn.dev33.satoken.httpauth.digest.SaHttpDigestUtil;
import cn.dev33.satoken.json.SaJsonTemplate; import cn.dev33.satoken.json.SaJsonTemplate;
import cn.dev33.satoken.listener.SaTokenEventCenter; import cn.dev33.satoken.listener.SaTokenEventCenter;
import cn.dev33.satoken.listener.SaTokenListener; import cn.dev33.satoken.listener.SaTokenListener;
import cn.dev33.satoken.log.SaLog; import cn.dev33.satoken.log.SaLog;
import cn.dev33.satoken.same.SaSameTemplate; import cn.dev33.satoken.same.SaSameTemplate;
import cn.dev33.satoken.sign.SaSignTemplate; import cn.dev33.satoken.sign.SaSignTemplate;
import cn.dev33.satoken.solon.json.SaJsonTemplateForSnack3;
import cn.dev33.satoken.solon.model.SaContextForSolon; import cn.dev33.satoken.solon.model.SaContextForSolon;
import cn.dev33.satoken.solon.oauth2.SaOAuth2AutoConfigure; import cn.dev33.satoken.solon.oauth2.SaOAuth2AutoConfigure;
import cn.dev33.satoken.solon.sso.SaSsoAutoConfigure; import cn.dev33.satoken.solon.sso.SaSsoAutoConfigure;
@@ -64,6 +67,9 @@ public class XPluginImp implements Plugin {
// 注入上下文Bean // 注入上下文Bean
SaManager.setSaTokenContext(new SaContextForSolon()); SaManager.setSaTokenContext(new SaContextForSolon());
// 注入JSON解析器Bean
SaManager.setSaJsonTemplate(new SaJsonTemplateForSnack3());
//注入配置Bean //注入配置Bean
SaTokenConfig saTokenConfig = Solon.cfg().getBean("sa-token", SaTokenConfig.class); SaTokenConfig saTokenConfig = Solon.cfg().getBean("sa-token", SaTokenConfig.class);
if (saTokenConfig != null) { if (saTokenConfig != null) {
@@ -89,7 +95,6 @@ public class XPluginImp implements Plugin {
SaTokenEventCenter.registerListener(sl); SaTokenEventCenter.registerListener(sl);
}); });
// 注入权限认证 Bean // 注入权限认证 Bean
context.getBeanAsync(StpInterface.class, bean -> { context.getBeanAsync(StpInterface.class, bean -> {
SaManager.setStpInterface(bean); SaManager.setStpInterface(bean);
@@ -115,6 +120,11 @@ public class XPluginImp implements Plugin {
SaHttpBasicUtil.saHttpBasicTemplate = bean; SaHttpBasicUtil.saHttpBasicTemplate = bean;
}); });
// Sa-Token Http Digest 认证模块 Bean
context.getBeanAsync(SaHttpDigestTemplate.class, bean -> {
SaHttpDigestUtil.saHttpDigestTemplate = bean;
});
// Sa-Token JSON 转换器 Bean // Sa-Token JSON 转换器 Bean
context.getBeanAsync(SaJsonTemplate.class, bean -> { context.getBeanAsync(SaJsonTemplate.class, bean -> {
SaManager.setSaJsonTemplate(bean); SaManager.setSaJsonTemplate(bean);
@@ -129,5 +139,6 @@ public class XPluginImp implements Plugin {
context.getBeanAsync(StpLogic.class, bean -> { context.getBeanAsync(StpLogic.class, bean -> {
StpUtil.setStpLogic(bean); StpUtil.setStpLogic(bean);
}); });
} }
} }