
Solon 集成 Sa-Token 权限认证框架从零搭建示例工程与源码级剖析【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token本篇技术指南围绕 Sa-Token 官方仓库中 sa-token-demo-solon 示例工程系统讲解如何在 Solon 应用中一步步集成 Sa-Token涵盖项目创建、依赖引入、配置编写、启动类与测试 Controller 编写、运行验证并深入剖析sa-token-solon-plugin的自动装配机制与可扩展能力。读完本文你将能够独立在 Solon 项目中完成 Sa-Token 的登录认证、会话校验与权限配置并理解其底层 Bean 注册流程。一、Solon 是什么为什么要在 Solon 中集成 Sa-TokenSolon 是一个国产应用开发框架主打更快、更小、更简单。官方文档给出的定位包括启动速度提升 5 10 倍、QPS 高 2 3 倍、运行时内存节省 1/3 1/2、打包体积可缩至 1/2 1/10同时支持 jdk8、jdk11、jdk17、jdk20 等多个版本。Sa-Token 是开源的 Java 权限认证框架提供了登录认证、权限认证、分布式 Session、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、JWT 集成、API Key 秘钥授权、API 参数签名等一站式能力。两者结合可以在轻量级 Solon 应用中快速获得完整的鉴权能力。官方仓库在 sa-token-demo/sa-token-demo-solon 目录下提供了完整的整合示例本文所有代码均以此示例为蓝本。如需查看更多集成场景可参考文档 集成示例大全下载。二、第一步创建 Solon 项目在 IDE 中新建一个 Solon 项目命名为sa-token-demo-solon可以借助 Solon Initializr 在线生成。为了直接对照仓库中的成品工程可以观察官方示例的项目结构sa-token-demo-solon/pom.xmlMaven 构建文件parent为org.noear:solon-parent示例中使用版本 3.2.1SaTokenDemoApp.javaSolon 启动主类UserController.java登录测试 Controllerapp.ymlSolon 配置文件。三、第二步添加依赖在项目中添加 Sa-Token 与 Solon 的整合依赖。核心依赖是sa-token-solon-plugin它负责将 Sa-Token 的上下文、过滤器、拦截器等能力桥接到 Solon 容器中。Maven 方式在 pom.xml 中添加!-- Sa-Token 权限认证在线文档https://sa-token.com -- dependency groupIdcn.dev33/groupId artifactIdsa-token-solon-plugin/artifactId version${sa.top.version}/version /dependencyGradle 方式在 build.gradle 中添加// Sa-Token 权限认证在线文档https://sa-token.com implementation cn.dev33:sa-token-solon-plugin:${sa.top.version}其中${sa.top.version}为 Sa-Token 版本号占位符需替换为具体版本。以仓库示例工程为例其 pom.xml 中通过sa-token.version属性声明版本并在 dependencies 中引入dependency groupIdcn.dev33/groupId artifactIdsa-token-solon-plugin/artifactId version${sa-token.version}/version /dependency示例工程还额外引入了两个可选的整合组件供参考sa-token-redisx将 Token 数据持久化到 Redissa-token-snack3JSON 序列化器组件Snack3 实现。如果 Maven 依赖一直无法加载成功可以参考文档 Maven 依赖拉取问题排查关于版本演进信息可查看 Sa-Token 新版本发布记录。依赖背后的自动装配机制从源码结构看sa-token-solon-plugin的入口是 SaSolonPlugin.java它实现了 Solon 的Plugin接口在start(AppContext)方法中依次将以下注册器与注入器装配进 Solon 容器SaBeanRegister/SaBeanInject核心 Bean 注册与注入上下文、DAO、配置等SaSsoBeanRegister/SaSsoBeanInjectSSO 单点登录支持SaOAuth2BeanRegister/SaOAuth2BeanInjectOAuth2.0 统一认证支持SaApiKeyBeanRegister/SaApiKeyBeanInjectAPI Key 秘钥授权支持SaSignBeanRegister/SaSignBeanInjectAPI 参数签名支持。这意味着引入一个sa-token-solon-plugin依赖即可同时获得 Sa-Token 核心鉴权以及 SSO、OAuth2、API Key、参数签名等扩展能力的自动装配入口无需额外手动注册。四、第三步设置配置文件Solon 的配置文件默认为app.yml也支持app.properties风格。你可以零配置启动项目——仅引入依赖即可运行同时也可以在配置文件中增加如下配置定制化使用框架。app.yml 风格server: # 端口 port: 8081 ############## Sa-Token 配置 (文档: https://sa-token.com) ############## sa-token: # token 名称同时也是 cookie 名称 token-name: satoken # token 有效期单位秒 默认30天-1 代表永久有效 timeout: 2592000 # token 最低活跃频率单位秒如果 token 超过此时间没有访问系统就会被冻结默认-1 代表不限制永不冻结 active-timeout: -1 # 是否允许同一账号多地同时登录 为 true 时允许一起登录, 为 false 时新登录挤掉旧登录 is-concurrent: true # 在多人登录同一账号时是否共用一个 token 为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token is-share: false # token 风格默认可取值uuid、simple-uuid、random-32、random-64、random-128、tik token-style: uuid # 是否输出操作日志 is-log: trueapp.properties 风格# 端口 server.port8081 ############## Sa-Token 配置 (文档: https://sa-token.com) ############## # token 名称同时也是 cookie 名称 sa-token.token-namesatoken # token 有效期单位秒 默认30天-1 代表永久有效 sa-token.timeout2592000 # token 最低活跃频率单位秒如果 token 超过此时间没有访问系统就会被冻结默认-1 代表不限制永不冻结 sa-token.active-timeout-1 # 是否允许同一账号多地同时登录 为 true 时允许一起登录, 为 false 时新登录挤掉旧登录 sa-token.is-concurrenttrue # 在多人登录同一账号时是否共用一个 token 为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token sa-token.is-sharefalse # token 风格默认可取值uuid、simple-uuid、random-32、random-64、random-128、tik sa-token.token-styleuuid # 是否输出操作日志 sa-token.is-logtrue仓库示例的 app.yml 中还演示了 Redis DAO 的扩展配置方式前缀可自定义如sa-token-daosa-token-dao: #名字可以随意取 redis: server: localhost:6379 # password: 123456 db: 1 maxTotal: 200配合 SaTokenConfigure.java 中的Bean方法即可将 Redis 作为 Sa-Token 的 DAO 实现注入容器// 如果需要 redis dao加这段代表 Bean public SaTokenDao saTokenDaoInit(Inject(${sa-token-dao.redis}) SaTokenDaoForRedisx saTokenDao) { return saTokenDao; }关键配置项说明配置项含义默认值/可选值token-nametoken 名称同时也是 Cookie 名称satokentimeouttoken 有效期秒-1 代表永久有效默认 30 天2592000active-timeouttoken 最低活跃频率秒超过此时间未访问则冻结-1 表示不限制、永不冻结-1is-concurrent是否允许同一账号多地同时登录true 允许一起登录false 时新登录挤掉旧登录trueis-share多人登录同一账号时是否共用一个 tokentrue 共用一个false 每次登录新建一个falsetoken-styletoken 风格uuid、simple-uuid、random-32、random-64、random-128、tikis-log是否输出操作日志true五、第四步创建启动类在项目中新建包com.pj在此包内新建主类SaTokenDemoApp.java复制以下代码SolonMain public class SaTokenDemoApp { public static void main(String[] args) { Solon.start(SaTokenDemoApp.class, args); System.out.println(启动成功Sa-Token 配置如下 SaManager.getConfig()); } }SolonMain是 Solon 的启动注解Solon.start(...)负责拉起容器。SaManager.getConfig()会打印当前生效的 Sa-Token 配置方便启动时核对参数。仓库中的真实实现见 SaTokenDemoApp.java。六、第五步创建测试 Controller创建一个 Controller 来验证登录与会话状态Mapping(/user/) Controller public class UserController { // 测试登录浏览器访问 http://localhost:8081/user/doLogin?usernamezhangpassword123456 Mapping(doLogin) public String doLogin(String username, String password) { // 此处仅作模拟示例真实项目需要从数据库中查询数据进行比对 if(zhang.equals(username) 123456.equals(password)) { StpUtil.login(10001); return 登录成功; } return 登录失败; } // 查询登录状态浏览器访问 http://localhost:8081/user/isLogin Mapping(isLogin) public String isLogin() { return 当前会话是否登录 StpUtil.isLogin(); } }StpUtil.login(10001)为当前会话登录账号10001登录后 Sa-Token 会自动生成 Token 并写入 CookieToken 名称即配置中的token-nameStpUtil.isLogin()判断当前会话是否已登录。仓库中的完整示例见 UserController.java其方法签名还保留了String username, String password参数行为与上文一致。七、第六步运行与验证启动SaTokenDemoApp主类然后从浏览器依次访问测试接口访问http://localhost:8081/user/doLogin?usernamezhangpassword123456使用正确的账号密码示例中为zhang/123456即可看到登录成功访问http://localhost:8081/user/isLogin即可看到当前会话是否登录true。若在未登录状态下直接访问isLogin则输出false。八、进阶示例工程中的全局过滤器与权限扩展官方示例不止包含登录测试还演示了在 Solon 场景下的全局路由拦截与自定义权限数据源这有助于你从能跑通走向可上线。1. 注册全局拦截器SaTokenConfigure.java 中通过Bean(index -100)注册了SaTokenInterceptor指定了拦截路由、认证函数、异常处理函数与前置函数Bean(index -100) public SaTokenInterceptor tokenPathFilter() { return new SaTokenInterceptor() // 指定 [拦截路由] 与 [放行路由] .addInclude(/**).addExclude(/favicon.ico) // 认证函数: 每次请求执行 .setAuth(r - { // SaRouter.match(/test/test, () - new Object()); }) // 异常处理函数每次认证函数发生异常时执行此函数 .setError(e - { System.out.println(---------- sa全局异常 ); return AjaxJson.getError(e.getMessage()); }) // 前置函数在每次认证函数之前执行BeforeAuth 不受 includeList 与 excludeList 的限制所有请求都会进入 .setBeforeAuth(r - { SaHolder.getResponse() .setServer(sa-server) .setHeader(X-Frame-Options, SAMEORIGIN) .setHeader(X-Frame-Options, 1; modeblock) .setHeader(X-Content-Type-Options, nosniff); }); }其中addInclude(/**)/addExclude(/favicon.ico)配置拦截与放行路由setAuth(...)每次请求执行的路由认证逻辑可配合SaRouter编写路由级权限校验setError(...)认证函数抛出异常时的兜底处理setBeforeAuth(...)在认证之前执行的逻辑不受拦截路由限制可用于统一设置安全响应头。从源码结构看SaTokenInterceptor与SaTokenFilter、SaTokenContextFilterForSolon、SaTokenCorsFilterForSolon、SaFirewallCheckFilterForSolon等一同位于 sa-token-solon-plugin 的 integration 包 下共同构成 Solon 环境下 Sa-Token 的 Web 层集成。2. 自定义权限数据源StpInterfaceImpl.java 实现了StpInterface接口并用Component注解交给 Solon 管理即可完成权限/角色数据的自定义扩展Component // 打开此注解保证此类被 solon 扫描即可完成 sa-token 的自定义权限验证扩展 public class StpInterfaceImpl implements StpInterface { // 返回一个账号所拥有的权限码集合 Override public ListString getPermissionList(Object loginId, String loginType) { // 本list仅做模拟实际项目中要根据具体业务逻辑来查询权限 ListString list new ArrayListString(); list.add(101); list.add(user-add); list.add(user-delete); list.add(user-update); list.add(user-get); list.add(article-get); return list; } // 返回一个账号所拥有的角色标识集合 Override public ListString getRoleList(Object loginId, String loginType) { ListString list new ArrayListString(); list.add(admin); list.add(super-admin); return list; } }实现该接口后StpUtil.hasPermission(user-add)、StpUtil.checkRole(admin)等权限校验方法即会自动调用这里的数据源进行判定。3. 更全面的测试 Controller示例工程的 TestController.java 还提供了丰富的自测接口覆盖了登录 / 退出登录/test/login、/test/logout角色校验hasRole、checkRoleOr、checkRoleAnd权限校验checkPermissionOr、checkPermissionAnd会话 Session 与自定义 SessiongetSession、SaSessionCustomUtilToken 专属 SessiongetTokenSessionToken 信息打印getTokenInfo注解式鉴权SaCheckLogin、SaCheckRole、SaCheckPermission、SaMode.OR活动时间续签checkActiveTimeout、updateLastActiveToNow踢人下线kickout、按设备类型登录、身份临时切换switchTo、会话治理searchTokenValue。这些接口可以直接启动工程后逐个访问端口见app.yml中配置的 8081是理解 Sa-Token 核心 API 的快速上手材料。4. 日志接入 Solon 日志体系若希望 Sa-Token 的操作日志统一输出到 Solon 的日志框架可以参考示例中的 SaLogForSolon.java它继承SaLogForConsole并实现SaLog在println中按日志等级转发给LogUtil.global()。默认未开启Component注解需要时打开注解即可生效。九、详细了解通过这个示例你已经对 Sa-Token 有了初步的了解。若要深入掌握登录认证的完整细节包括多账号体系、记住我、踢人下线、权限注解、拦截器与过滤器等推荐继续阅读 登录认证——该文档的说明与 Solon 场景处理方式类似可直接对照本示例工程进行验证。【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考