依赖
<!--核心库--> <dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-spring-boot-starter</artifactId> <version>1.20.0</version> </dependency> <!--用Redis缓存授权信息--> <dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-dao-redis</artifactId> <version>1.20.0</version> </dependency> <!--注解式权限验证--> <dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-spring-aop</artifactId> <version>1.20.0</version> </dependency>
修改application.yml
sa-token: #token名称 (同时也是cookie名称) token-name: token # token有效期,单位s 默认30天, -1代表永不过期 timeout: 2592000 # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒 activity-timeout: -1 # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) allow-concurrent-login: true # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) is-share: false # token风格 token-style: uuid
三、权限和角色判定
在本项目中,我们用注解的方式判定用户是否为特定的角色或者拥有某些权限。Sa-Token框架为我们提供了这样的注解。比如说下面的Web方法用到了@SaCheckPermission
注解判断用户是否具备ROOT
或者AMECT:INSERT
权限。
@PostMapping("/insert")
@Operation(summary = "添加罚款记录")
@SaCheckPermission(value = {"ROOT", "AMECT:INSERT"}, mode = SaMode.OR)
public R insert(@Valid @RequestBody InsertAmectForm form) {
……
}
@SaCheckPermission
或者@SaCheckRole
注解拦截HTTP请求的时候,会调用特定的Java类来获取用户的权限和角色信息,然后跟注解要求的权限或者角色做匹配,如果能匹配上,就允许HTTP请求调用Web方法,否则就拒绝HTTP请求。话说回来,查询用户权限和角色的若干Java代码需要我们自己写,下面咱们就先从SQL语句开始。
<select id="searchUserPermissions" parameterType="int" resultType="String"> SELECT DISTINCT p.permission_name FROM tb_user u JOIN tb_role r ON JSON_CONTAINS(u.role, CAST(r.id AS CHAR)) JOIN tb_permission p ON JSON_CONTAINS(r.permissions, CAST(p.id AS CHAR)) WHERE u.id=#{userId} AND u.status=1; </select>
在com.example.emos.api.config
包中创建StpInterfaceImpl.java
类,这个Java类就是Sa-Token框架拦截HTTP请求之后调用的类。在这个类中,我们一共要声明两个方法分别用来查询用户实际的权限和角色。然后Sa-Token框架的@SaCheckPermission
或者@SaCheckRole
注解会根据查询出来的权限和角色,跟注解要求的权限或者角色做匹配。
package com.example.emos.api.config; import cn.dev33.satoken.stp.StpInterface; import com.example.emos.api.db.dao.TbUserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.List; import java.util.Set; @Component public class StpInterfaceImpl implements StpInterface { @Autowired private TbUserDao userDao; /** * 返回一个用户所拥有的权限集合 */ @Override public List<String> getPermissionList(Object loginId, String loginKey) { int userId = Integer.parseInt(loginId.toString()); Set<String> permissions = userDao.searchUserPermissions(userId); ArrayList list = new ArrayList(); list.addAll(permissions); return list; } /** * 返回一个用户所拥有的角色标识集合 */ @Override public List<String> getRoleList(Object loginId, String loginKey) { //因为本项目不需要用到角色判定,所以这里就返回一个空的ArrayList对象 ArrayList<String> list = new ArrayList<String>(); return list; } }
好了,至此我们就已经配置好了Sa-Token权限验证框架,比我们自己动手配置Shiro+JWT要简单多了
标签:角色,satoken,ArrayList,token,整合,注解,import,权限,鉴权 From: https://www.cnblogs.com/sgj191024/p/17801894.html