
Sa-Token 集成 Solon 示例从零搭建登录鉴权应用【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token本指南基于开源仓库GitHub_Trending/sa/Sa-Token中的官方文档与源码完整演示如何在 Solon 应用中集成 Sa-Token涵盖依赖引入、配置文件编写、启动类与测试 Controller 的创建并深入 sa-token-solon-plugin 源码揭示其自动装配与全局鉴权拦截的底层原理。读完本文你将能够在 Solon 工程中快速落地一套可运行的登录认证能力并掌握 Sa-Token 核心配置项的真实语义与进阶定制方法。一、Solon 是什么Solon 是一款高效的国产应用开发框架主打“更快、更小、更简单”它不需要 Spring也没有 Servlet同时支持 jdk8、jdk11、jdk17、jdk20。Sa-Token 官方为其提供了专门的集成插件sa-token-solon-plugin让 Sa-Token 的鉴权能力可以在 Solon 生态中原生运行。官方完整的可运行示例位于仓库的sa-token-demo/sa-token-demo-solon目录遇到难点时可直接结合该源码进行学习测试更多示例可在 Sa-Token 集成示例大全 中查看下载。二、创建项目在 IDE 中新建一个 Solon 项目例如命名为sa-token-demo-solon。为了获得与官方示例一致的依赖管理示例项目采用了 Solon 官方父工程作为 parent见 pom.xmlparent groupIdorg.noear/groupId artifactIdsolon-parent/artifactId version3.2.1/version relativePath/ /parent三、添加依赖在项目中引入 Sa-Token 的 Solon 插件这是整个集成的核心依赖。Maven 方式!-- Sa-Token 权限认证 -- dependency groupIdcn.dev33/groupId artifactIdsa-token-solon-plugin/artifactId version${sa.top.version}/version /dependencyGradle 方式// Sa-Token 权限认证 implementation cn.dev33:sa-token-solon-plugin:${sa.top.version}其中${sa.top.version}为 Sa-Token 版本占位符请替换为你实际使用的版本号。官方演示项目 pom.xml 中当前使用的版本为1.46.0以sa-token.version属性管理并额外引入了两类配套组件!-- sa-token 整合 redis (使用 jdk 默认序列化方式) -- dependency groupIdcn.dev33/groupId artifactIdsa-token-redisx/artifactId version${sa-token.version}/version /dependency !-- sa-token json 序列化器组件snack3 实现 -- dependency groupIdcn.dev33/groupId artifactIdsa-token-snack3/artifactId version${sa-token.version}/version /dependency如果 Maven 依赖一直无法加载成功可参考仓库内 maven-pull.md 中的解决方案。四、设置配置文件集成插件后你可以零配置启动项目但也可以在配置文件中按需定制。Sa-Token 在 Solon 下支持app.yml与app.properties两种风格二者等价。app.yml 风格server: # 端口 port: 8081 ############## Sa-Token 配置 ############## 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 配置 ############## # 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这些配置项在 SaTokenConfig.java 中有对应的默认值与完整语义配置项默认值源码定义说明token-namesatokentoken 名称同时也是 cookie 名称、提交 token 时的参数名称、存储 token 时的 key 前缀timeout60*60*24*3030 天token 有效期秒-1代表永久有效active-timeout-1token 最低活跃频率秒超过该时间未访问即被冻结-1代表不限制is-concurrenttrue是否允许同一账号多地同时登录is-sharefalse多人登录同一账号时是否共用同一个 tokentoken-styleuuidtoken 风格uuid、simple-uuid、random-32、random-64、random-128、tik等is-logfalse是否输出操作日志值得注意的是sa-token-solon-plugin在启动时正是通过读取sa-token前缀的配置段来构造SaTokenConfig的在 SaBeanRegister.java 中通过Inject(value ${sa-token}, required false)注入配置对象若未配置则回退到默认的new SaTokenConfig()这就是“零配置即可启动”的底层实现。五、创建启动类在项目中新建包com.pj在该包下新建主类SaTokenDemoApp.java复制以下代码与仓库示例 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 的主类标记注解SaManager.getConfig()用于在启动后打印当前生效的 Sa-Token 配置便于核对配置是否被正确加载。六、创建测试 Controller在包com.pj.test下创建UserController.java复制以下代码与仓库示例 UserController.java 一致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(); } }这里演示了 Sa-Token 的两个核心 APIStpUtil.login(10001)在验证账号密码通过后为当前会话完成登录内部会生成 token、建立会话并写入数据源StpUtil.isLogin()判断当前会话是否已登录。七、运行测试启动SaTokenDemoApp在浏览器中依次访问测试接口登录测试访问http://localhost:8081/user/doLogin?usernamezhangpassword123456携带正确账号密码时返回登录成功同时浏览器会获得名为satoken即token-name配置值的 cookie状态查询访问http://localhost:8081/user/isLogin由于上一步已写入登录态此处返回当前会话是否登录true。若未登录直接访问isLogin则返回当前会话是否登录false。至此一个基于 Solon 的最小登录鉴权应用已经跑通。八、深入sa-token-solon-plugin 是如何工作的官方演示项目之所以能做到“引入依赖即得鉴权能力”背后是sa-token-solon-plugin提供的自动装配机制其实现位于仓库 sa-token-starter/sa-token-solon-plugin 模块下主要分为三个环节。1. 插件入口 SaSolonPluginSaSolonPlugin.java 实现了 Solon 的Plugin接口在应用启动时批量注册各模块的 Beanpublic class SaSolonPlugin implements Plugin { Override public void start(AppContext context) { // sa-token context.beanMake(SaBeanRegister.class); context.beanMake(SaBeanInject.class); // sa-sso / sa-oauth2 / sa-apikey / sa-sign context.beanMake(SaSsoBeanRegister.class); context.beanMake(SaSsoBeanInject.class); context.beanMake(SaOAuth2BeanRegister.class); ... } }从源码结构可以看出该插件不仅支持基础的登录鉴权还同时装配了 SSO 单点登录、OAuth2、API Key 与参数签名等扩展模块的注册与注入类Solon 用户可以按需引入对应组件直接使用。2. Bean 注册与注入分离SaBeanRegister.java 负责“注册”它在构造时重写了 Sa-Token 的策略接口路由匹配算法、SaRequest/SaResponse/SaStorage的创建策略并注册了上下文过滤器、CORS 跨域过滤器与防火墙过滤器SaBeanInject.java 负责“注入”通过Condition(onBean ...)的方式将用户自定义的SaTokenDao、StpInterface、SaTokenListener、SaLog、序列化器等 Bean 挂载到SaManager上。注册与注入拆分成两个文件是为了避免某些场景下的循环依赖。3. 基于路由的过滤式鉴权SaTokenInterceptor.java 实现了 Solon 的RouterInterceptor是核心的鉴权执行点。其doIntercept方法执行链路为先执行前置函数beforeAuth常见于跨域与安全响应头设置→ 依据 includeList / excludeList 做路径匹配 → 执行注解校验SaCheckLogin、SaCheckRole等由SaAnnotationStrategy驱动→ 执行认证函数 → 异常时交给 error 函数处理。它同时支持 Gateway 场景的鉴权并通过order: -100保证较高的执行优先级。类注释中特别说明SaTokenInterceptor与SaTokenFilter是二选一的关系不要同时使用。九、进阶定制全局过滤器与权限扩展官方演示项目在com.pj.satoken包下提供了两个进阶定制示例帮助你从“能登录”走向“能生产”。1. 注册全局过滤器 SaTokenConfigureSaTokenConfigure.java 演示了如何注册 Sa-Token 全局过滤器并配置拦截/放行路由与各类钩子函数Configuration public class SaTokenConfigure { 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-Content-Type-Options, nosniff); }); } // 如果需要 redis dao加这段代表 Bean public SaTokenDao saTokenDaoInit(Inject(${sa-token-dao.redis}) SaTokenDaoForRedisx saTokenDao) { return saTokenDao; } }其中.addInclude(/**)表示拦截所有路由、.addExclude(/favicon.ico)放行指定资源setBeforeAuth中通过SaHolder.getResponse()设置了若干安全响应头该回调不受拦截/放行列表限制所有请求都会进入。示例同时展示了通过SaTokenDaoForRedisx将数据源切换到 Redis 的写法对应sa-token-redisx组件。2. 自定义权限验证接口 StpInterfaceImplStpInterfaceImpl.java 实现了 Sa-Token 的权限数据源接口StpInterface用于向框架提供“账号 → 权限码/角色标识”的映射Component 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; } }只要给该类加上Component注解使其被 Solon 扫描SaBeanInject便会通过Condition(onBean StpInterface.class)自动完成挂载随后StpUtil.hasPermission(...)、SaCheckRole(...)等权限校验即可生效。演示项目中的 TestController.java 还提供了角色校验checkRole/checkRoleOr/checkRoleAnd、权限校验checkPermission系列、会话 Session、自定义 Session、踢人下线、身份临时切换等更完整的测试接口可作为功能体验与二次开发的参考样板。十、详细了解通过以上步骤你已经对 Sa-Token 的集成方式有了初步了解。接下来可以深入阅读登录认证详细讲解登录流程、注销、会话管理与 Spring Boot 中的处理方式类似权限认证基于角色与权限码的细粒度鉴权Sa-Token 集成示例大全SSO、OAuth2、WebFlux、Redis 等更多场景的可运行示例Solon 环境示例源码本文全部代码的完整可运行版本【免费下载链接】Sa-Token✨ 开源、免费、一站式 Java 权限认证框架让鉴权变得简单、优雅—— 登录认证、权限认证、分布式 Session 会话、微服务网关鉴权、SSO 单点登录、OAuth2.0 统一认证、jwt 集成、API Key 秘钥授权、API 参数签名项目地址: https://gitcode.com/GitHub_Trending/sa/Sa-Token创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考