环境:SpringBoot3、jdk17
Sa-TokenSa-Token是一个java权限认证框架,功能全面,上手简单,登录认证、权限认证、Session会话、踢人下线、账号封禁、集成Redis、前后端分离、分布式会话、微服务网关鉴权、单点登录、OAuth2.0、临时Token验证、记住我模式、模拟他人账号、临时身份切换、多账号体系、注解式鉴权、路由拦截式鉴权、花式token、自动续签、同端互斥登录、会话治理、密码加密、jwt集成、Spring集成、WebFlux集成...,有了sa-token,你所有的权限认证问题,都不再是问题
https://sa-token.cc/index.html Sa-Token 是一个轻量级、无侵入、功能强大的 Java 权限认证框架。轻量级:核心依赖少,性能强大,能够快速上手;无侵入:通过注解和拦截器实现权限控制;
1.导入依赖
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot3-starter</artifactId><version>1.38.0</version>
</dependency><dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redis-jackson</artifactId><version>1.38.0</version>
</dependency>
2.添加配置
############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
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: true
3.登录认证
服务器校验账号密码,为用户颁发 Token 会话凭证;
3.1 登录接口
/**
* 登录
* @param loginVo
* @return
*/
@PostMapping("/login")
public Result login(@RequestBody LoginData loginData) {
//Sa-token认证登录
StpUtil.login(user.getId());
//返回结果初始化
JSONObject result = new JSONObject();
//保存登录信息: 令牌 + 刷新令牌(用于令牌过期或快过期申请新令牌使用)
result.putOpt("token", StpUtil.getTokenValue());
return Result.ok(result);
}
- StpUtil.login(id) 方法利用了 Cookie 自动注入的特性,甚至你都不需要主动向前端返回 token 信息;
- 其他还有 StpUtil.logout() 注销、StpUtil.isLogin() 是否登录等提供的方法;
3.2 配置拦截器
@Component
public class SaTokenInterceptor implements WebMvcConfigurer {
/**
* 新增拦截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SaInterceptor(handle-> {
//Sa-token框架校验
StpUtil.checkLogin();
})).addPathPatterns("/**") //拦截范围
.excludePathPatterns("/auth/login",//放行登录接口
"/auth/validateCode",//放行验证码接口
"/doc.html", "/v3/api-docs/**", "/webjars/**","/favicon.ico");//放行swagger相关接口
}
}
4.权限认证
框架校验账户拥有的权限码集合中是否包含指定的权限码;
4.1 获取当前账号权限码集合
/***
* 自定义权限加载接口实现类
*/
@Component
public class StpInterfaceImpl implements StpInterface {
@Autowired
private SysMenuMapper sysMenuMapper;
/**
* 返回一个账号所拥有的权限码集合
* @param loginId
* @param loginType
* @return
*/
@Override
public List<String> getPermissionList(Object loginId, String loginType) {
//查询用户的功能权限
return sysMenuMapper.selectUserPermsByUserId(Long.parseLong(loginId.toString()));
}
@Autowired
private SysUserRoleMapper sysUserRoleMapper;
/**
* 返回一个账号所拥有的角色标识集合
* @param loginId
* @param loginType
* @return
*/
@Override
public List<String> getRoleList(Object loginId, String loginType) {
return sysUserRoleMapper.selectRoleCodesByUserId(Long.parseLong(loginId.toString()));
}
}
4.2 注解鉴权
- @SaCheckLogin:登录校验 —— 只有登录之后才能进入该方法。
- @SaCheckRole("admin"):角色校验 —— 必须具有指定角色标识才能进入该方法。
- @SaCheckPermission("user:add"):权限校验 —— 必须具有指定权限才能进入该方法。
- @SaCheckSafe:二级认证校验 —— 必须二级认证之后才能进入该方法。
- @SaCheckHttpBasic:HttpBasic校验 —— 只有通过 HttpBasic 认证后才能进入该方法。
- @SaCheckHttpDigest:HttpDigest校验 —— 只有通过 HttpDigest 认证后才能进入该方法。
- @SaCheckDisable("comment"):账号服务封禁校验 —— 校验当前账号指定服务是否被封禁。
- @SaCheckSign:API 签名校验 —— 用于跨系统的 API 签名参数校验。
- @SaIgnore:忽略校验 —— 表示被修饰的方法或类无需进行注解鉴权和路由拦截器鉴权。
@SaCheckPermission("list")
@SaCheckRole("6")
@GetMapping(value = "/list")
public Result list(){
return Result.ok(service.list();
}
2118

被折叠的 条评论
为什么被折叠?



