From 660a8430f16574665b3ef29a13aa26c5bcbda055 Mon Sep 17 00:00:00 2001 From: ayi <2294931964@qq.com> Date: Mon, 2 Feb 2026 17:27:09 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BD=91=E5=85=B3=E6=95=B4=E5=90=88Sa-Token?= =?UTF-8?q?=E9=89=B4=E6=9D=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 ++ .../auth/controller/UserController.java | 7 +++ xiaoyi-gateway/pom.xml | 28 +++++++++++ .../xiaoyi/gateway/auth/SaTokenConfigure.java | 48 +++++++++++++++++++ .../xiaoyi/gateway/auth/StpInterfaceImpl.java | 27 +++++++++++ .../src/main/resources/application.yml | 40 ++++++++++++++++ 6 files changed, 155 insertions(+) create mode 100644 xiaoyi-gateway/src/main/java/top/crushtj/xiaoyi/gateway/auth/SaTokenConfigure.java create mode 100644 xiaoyi-gateway/src/main/java/top/crushtj/xiaoyi/gateway/auth/StpInterfaceImpl.java diff --git a/pom.xml b/pom.xml index 51c2aaf..9cfa4d6 100644 --- a/pom.xml +++ b/pom.xml @@ -146,6 +146,11 @@ cn.dev33 sa-token-spring-boot3-starter ${sa-token.version} + + + cn.dev33 + sa-token-reactor-spring-boot3-starter + ${sa-token.version} diff --git a/xiaoyi-auth/src/main/java/top/crushtj/xiaoyi/auth/controller/UserController.java b/xiaoyi-auth/src/main/java/top/crushtj/xiaoyi/auth/controller/UserController.java index c641092..cd29715 100644 --- a/xiaoyi-auth/src/main/java/top/crushtj/xiaoyi/auth/controller/UserController.java +++ b/xiaoyi-auth/src/main/java/top/crushtj/xiaoyi/auth/controller/UserController.java @@ -33,5 +33,12 @@ public class UserController { public Response loginOrRegister(@RequestBody @Validated UserLoginReqVO userLoginReqVO) { return userService.loginOrRegister(userLoginReqVO); } + + @PostMapping("/logout") + @ApiOperationLog(description = "用户登出") + public Response logout() { + // todo 实现用户登出逻辑 + return Response.success(); + } } diff --git a/xiaoyi-gateway/pom.xml b/xiaoyi-gateway/pom.xml index c016a0f..937971b 100644 --- a/xiaoyi-gateway/pom.xml +++ b/xiaoyi-gateway/pom.xml @@ -36,6 +36,34 @@ org.springframework.cloud spring-cloud-starter-loadbalancer + + + + cn.dev33 + sa-token-reactor-spring-boot3-starter + + + + + cn.dev33 + sa-token-redis-jackson + + + + + org.apache.commons + commons-pool2 + + + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + + + org.springframework.boot + spring-boot-starter-actuator + diff --git a/xiaoyi-gateway/src/main/java/top/crushtj/xiaoyi/gateway/auth/SaTokenConfigure.java b/xiaoyi-gateway/src/main/java/top/crushtj/xiaoyi/gateway/auth/SaTokenConfigure.java new file mode 100644 index 0000000..92f2d30 --- /dev/null +++ b/xiaoyi-gateway/src/main/java/top/crushtj/xiaoyi/gateway/auth/SaTokenConfigure.java @@ -0,0 +1,48 @@ +package top.crushtj.xiaoyi.gateway.auth; + +import cn.dev33.satoken.reactor.filter.SaReactorFilter; +import cn.dev33.satoken.router.SaRouter; +import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.util.SaResult; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author ayi + * @version V1.0 + * @title SaTokenConfigure + * @date 2026/2/2 17:16 + * @description SaToken配置类 + */ + +@Configuration +public class SaTokenConfigure { + // 注册 Sa-Token全局过滤器 + @Bean + public SaReactorFilter getSaReactorFilter() { + return new SaReactorFilter() + // 拦截地址 + .addInclude("/**") /* 拦截全部path */ + // 鉴权方法:每次访问进入 + .setAuth(obj -> { + // 登录校验 + SaRouter.match("/**") // 拦截所有路由 + .notMatch("/auth/user/login") // 排除登录接口 + .notMatch("/auth/verification/code/send") // 排除验证码发送接口 + .check(r -> StpUtil.checkLogin()) // 校验是否登录 + ; + + // 权限认证 -- 不同模块, 校验不同权限 + // SaRouter.match("/user/**", r -> StpUtil.checkPermission("user")); + // SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin")); + // SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods")); + // SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders")); + + // 更多匹配 ... */ + }) + // 异常处理方法:每次setAuth函数出现异常时进入 + .setError(e -> { + return SaResult.error(e.getMessage()); + }); + } +} diff --git a/xiaoyi-gateway/src/main/java/top/crushtj/xiaoyi/gateway/auth/StpInterfaceImpl.java b/xiaoyi-gateway/src/main/java/top/crushtj/xiaoyi/gateway/auth/StpInterfaceImpl.java new file mode 100644 index 0000000..501dc86 --- /dev/null +++ b/xiaoyi-gateway/src/main/java/top/crushtj/xiaoyi/gateway/auth/StpInterfaceImpl.java @@ -0,0 +1,27 @@ +package top.crushtj.xiaoyi.gateway.auth; + +import cn.dev33.satoken.stp.StpInterface; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @author ayi + * @version V1.0 + * @title StpInterfaceImpl + * @date 2026/2/2 17:14 + * @description 自定义权限验证接口 + */ + +@Component +public class StpInterfaceImpl implements StpInterface { + @Override + public List getPermissionList(Object o, String s) { + return List.of(); + } + + @Override + public List getRoleList(Object o, String s) { + return List.of(); + } +} diff --git a/xiaoyi-gateway/src/main/resources/application.yml b/xiaoyi-gateway/src/main/resources/application.yml index 00e03fc..de378f3 100644 --- a/xiaoyi-gateway/src/main/resources/application.yml +++ b/xiaoyi-gateway/src/main/resources/application.yml @@ -10,3 +10,43 @@ spring: - Path=/auth/** filters: - StripPrefix=1 + data: + redis: + database: 0 # Redis 数据库索引(默认为 0) + host: ENC(C1TWXF+/HzWQBF25uXCdy/0fHoRDXdCW72+NKCIJURg4l3IDnJzl278KmFhfsusX) # Redis 服务器地址 + port: 6379 # Redis 服务器连接端口 + password: ENC(iK/k0IGPflACqYMUwX4N/sGvCVuysYywLcAO+Ikeqk326V8hCr8dgEGzkiEIwWOo) # Redis 服务器连接密码(默认为空) + timeout: 5s # 读超时时间 + connect-timeout: 5s # 链接超时时间 + lettuce: + pool: + max-active: 200 # 连接池最大连接数 + max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制) + min-idle: 0 # 连接池中的最小空闲连接 + max-idle: 10 # 连接池中的最大空闲连接 + +############## 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: true + # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik) + token-style: uuid + # 是否输出操作日志 + is-log: true + +jasypt: + encryptor: + password: + algorithm: PBEWithHMACSHA512AndAES_256 + key-obtention-iterations: 1000 + string-output-type: base64 + provider-name: SunJCE + iv-generator-classname: org.jasypt.iv.RandomIvGenerator \ No newline at end of file