整合satoken鉴权
依赖
<!--核心库--> <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要简单多了
浙公网安备 33010602011771号