Springboot 整合Sa-Token
文档:https://sa-token.cc
根据自己选择的版本来进入不同的文档
这是当前文档选择的版本文档:https://sa-token.cc/v/v1.34.0/doc.html#/
什么是Sa-Token?
Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。
Sa-Token 旨在以简单、优雅的方式完成系统的权限认证部分
为什么用它呢?
简单开箱即用,文档详细,简单易上手,功能丰富。
缺点:个人感觉封装的东西太多,导致丧失一定的灵活性,可能在碰到一些问题解决的成本也比较高。
SpringBoot 整合Sa-Token
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
<dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-spring-boot-starter</artifactId> <version>${saToken.version}</version> </dependency>
<dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-dao-redis</artifactId> <version>${saToken.version}</version> </dependency>
|
yml配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| spring: redis: database: 3 host: 127.0.0.1 port: 6379 timeout: 10s lettuce: pool: max-active: 200 max-wait: -1ms max-idle: 10 min-idle: 0
sa-token: token-prefix: Bearer token-name: Authorization timeout: 2592000 activity-timeout: 1800 is-concurrent: true is-share: true token-style: uuid is-log: false jwt-secret-key: asdsdaeuiwstarac123 is-read-cookie: false
|
实现Stp接口
该接口主要是用于saToken在查询用户权限或者角色时进行调用的实现类
StpInterfaceImpl
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| @Component public class StpInterfaceImpl implements StpInterface { @Resource private UserMapper userMapper;
@Override public List<String> getPermissionList(Object loginId, String loginKey) { Long userId = Long.parseLong(loginId.toString()); List<String> list = userMapper.searchUserPermissions(userId); return list; }
@Override public List<String> getRoleList(Object loginId, String loginKey) { Long userId = Long.parseLong(loginId.toString()); userMapper.searchUserRole(userId); return null; }
}
|
开启注解并配置拦截器
SaTokenInterceptor
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| @Log4j2 @Configuration public class SaTokenInterceptor implements WebMvcConfigurer {
@Override public void addInterceptors(InterceptorRegistry registry) { log.info("sa-token拦截器"); registry.addInterceptor(new SaInterceptor(handler -> { SaRouter .match("/**") .notMatch("/**/login/**", "/**/outLogin/**", "/**/error/**", "/**/register/**", "/**/verify/**", "/**/monitorLogin/**", "/**/enterprise/get", "/**/enterprise/getLogo", "/**/getSAStoken/**", "/**/favicon.ico") .notMatch("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**", "/doc.html") .check(r -> { try { StpUtil.checkLogin(); } catch (NotLoginException e) { log.error(e.getMessage()); throw new BizException(ResultCode.RC403); } long tokenSessionTimeout = StpUtil.getTokenTimeout(); log.info("tokenSessionTimeout剩余时间{}:", tokenSessionTimeout); if (tokenSessionTimeout < (60 * 60 * 24)) { StpUtil.renewTimeout(60 * 60 * 24 * 10); } } ); SaRouter.notMatch("/**/login/**","/**/outLogin/**").match("/user/**", r -> StpUtil.checkPermission("user")); SaRouter.match("/role/**", r -> StpUtil.checkPermission("role")); SaRouter.match("/func/**", r -> StpUtil.checkPermission("func")); })) .addPathPatterns("/**"); }
@Bean public SaServletFilter getSaServletFilter() { return new SaServletFilter() .addInclude("/**").addExclude("/favicon.ico") .setAuth(obj -> { }) .setError(e -> { return AjaxJson.getError(e.getMessage()); }) .setBeforeAuth(obj -> { SaHolder.getResponse() .setHeader("Access-Control-Allow-Origin", "*") .setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE") .setHeader("Access-Control-Max-Age", "3600") .setHeader("Access-Control-Allow-Headers", "*"); SaRouter.match(SaHttpMethod.OPTIONS) .free(r -> System.out.println("--------OPTIONS预检请求,不做处理")) .back(); }) ; } }
|
整合gitHub地址: https://github.com/clollipop/springbootInit
到这里实际已经完成了整个的配置
如果要实现其他的操作可以参看官方文档,官方文档写的更加详细。