【Sa-Token】5、Sa-Token授权操作

简介: Sa-Token 在用户登录之后,并不会马上授权,而是等到需要验证的时候,才会去授权,授权也非常简单,我们只需要实现 StpInterface 接口,重写 getRoleList、getPermissionList 两个方法就好了,与 shiro 一样,同样返回 role 的标识集合,和 permission 的标识集合就好了

Sa-Token 在用户登录之后,并不会马上授权,而是等到需要验证的时候,才会去授权,授权也非常简单,我们只需要实现 StpInterface 接口,重写 getRoleList、getPermissionList 两个方法就好了,与 shiro 一样,同样返回 role 的标识集合,和 permission 的标识集合就好了

1、用户授权

package com.asurplus.common.satoken;
import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.collection.CollectionUtil;
import com.asurplus.system.service.SysRolePermissionService;
import com.asurplus.system.service.SysUserRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
 * 自定义权限验证接口扩展
 */
@Component
public class SaTokenStpInterfaceImpl implements StpInterface {
    @Autowired
    private SysUserRoleService sysUserRoleService;
    @Autowired
    private SysRolePermissionService sysRolePermissionService;
    /**
     * 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        // 从session中获取
        Object object = StpUtil.getTokenSession().get(SaTokenSessionConst.ROLE_LIST);
        if (null != object) {
            return (List<String>) object;
        }
        // 根据用户id查询角色集合
        List<String> list = sysUserRoleService.listRoleSignByUserId(Integer.parseInt(String.valueOf(loginId)));
        // 存入session中
        if (CollectionUtil.isNotEmpty(list)) {
            StpUtil.getTokenSession().set(SaTokenSessionConst.ROLE_LIST, list);
        }
        return list;
    }
    /**
     * 返回一个账号所拥有的权限码集合
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        // 从session中获取
        Object object = StpUtil.getTokenSession().get(SaTokenSessionConst.PERMISSION_LIST);
        if (null != object) {
            return (List<String>) object;
        }
        // 超级管理员
        if (StpUtil.hasRole("administrator")) {
            List<String> list = new ArrayList<>();
            list.add("*");
            return list;
        }
        // 根据用户id查询权限集合
        List<String> list = sysRolePermissionService.listPermissionSignByUserId(Integer.parseInt(String.valueOf(loginId)));
        // 存入session中
        if (CollectionUtil.isNotEmpty(list)) {
            StpUtil.getTokenSession().set(SaTokenSessionConst.ROLE_LIST, list);
        }
        return list;
    }
}

这里我们用到了 StpUtil.getTokenSession(),Token-Session: 指的是框架为每个 token 分配的 Session,它跟 HttpSession 没有任何关系,但是用户跟 HttpSession 差不多,我们可以将用户的权限数据存储到 Token-Session 中,这样我们就不必每次都去查询数据库了,减少了与数据库的交互次数,提高效率

相关文章
|
缓存 NoSQL 中间件
【Sa-Token】6、Sa-Token集成Redis
Sa-Token 支持 Redis、Memcached 等专业的缓存中间件中, 做到重启数据不丢失,而且保证分布式环境下多节点的会话一致性
2786 0
|
前端开发
【Sa-Token】7、Sa-Token抛出的异常统一处理
在 Sa-Token 的登录,授权,验证过程中,会抛出很多的异常,我们不能将这些异常信息直接返回给用户,因为用户是看不懂这些异常信息的,我们就需要对这些异常信息进行处理,处理之后再返回展示给前端用户
2066 0
sa-token实现网关调用认证服务统一鉴权
sa-token实现网关调用认证服务统一鉴权
867 0
解决SpringBoot无法访问静态资源文件
解决SpringBoot无法访问静态资源文件
解决SpringBoot无法访问静态资源文件
|
消息中间件 JSON Java
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
Spring Boot、Spring Cloud与Spring Cloud Alibaba版本对应关系
32779 0
|
存储 前端开发 中间件
vue3之vite配置vite-plugin-mock使用mock轻松创建模拟数据提高开发效率
vue3之vite配置vite-plugin-mock使用mock轻松创建模拟数据提高开发效率
2385 0
|
Java 数据库连接 Spring
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could
这个错误通常出现在使用Spring Boot进行数据库连接时。错误信息表明Spring Boot未能配置一个DataSource,因为没有指定'url'属性,并且没有发现默认的数据库连接。
6167 0
|
easyexcel Java API
Apache POI、EasyPoi、EasyExcel 三种区别,如何选择
Apache POI、EasyPoi、EasyExcel 三种区别,如何选择
2418 0
|
前端开发 微服务
Gateway处理全局异常
satoken 提供的示例,适用于单体项目的全局异常捕获。我选择了微服务架构,则就要变为通过网关来进行全局异常的处理,当权限发生异常的时候,可以统一做 401 的返回,前端进行跳转登录。

热门文章

最新文章