整合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要简单多了

 

 

 

posted @ 2023-10-31 22:51  sgj191024  阅读(61)  评论(0编辑  收藏  举报