便宜的做网站公司经典广告语
环境: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*/@Overridepublic 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 {@Autowiredprivate SysMenuMapper sysMenuMapper;/*** 返回一个账号所拥有的权限码集合 * @param loginId* @param loginType* @return*/@Overridepublic List<String> getPermissionList(Object loginId, String loginType) {//查询用户的功能权限return sysMenuMapper.selectUserPermsByUserId(Long.parseLong(loginId.toString()));}@Autowiredprivate SysUserRoleMapper sysUserRoleMapper;/*** 返回一个账号所拥有的角色标识集合* @param loginId* @param loginType* @return*/@Overridepublic 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();}