【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 中,这样我们就不必每次都去查询数据库了,减少了与数据库的交互次数,提高效率

目录
相关文章
|
8月前
sa-token实现网关调用认证服务统一鉴权
sa-token实现网关调用认证服务统一鉴权
420 0
|
前端开发
【Sa-Token】7、Sa-Token抛出的异常统一处理
在 Sa-Token 的登录,授权,验证过程中,会抛出很多的异常,我们不能将这些异常信息直接返回给用户,因为用户是看不懂这些异常信息的,我们就需要对这些异常信息进行处理,处理之后再返回展示给前端用户
1384 0
|
缓存 NoSQL 中间件
【Sa-Token】6、Sa-Token集成Redis
Sa-Token 支持 Redis、Memcached 等专业的缓存中间件中, 做到重启数据不丢失,而且保证分布式环境下多节点的会话一致性
1798 0
|
5月前
|
API
【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configuration内容
【Azure Developer】记录一段验证AAD JWT Token时需要设置代理获取openid-configuration内容
|
5月前
|
JSON 算法 API
【Azure API 管理】APIM 配置Validate-JWT策略,验证RS256非对称(公钥/私钥)加密的Token
【Azure API 管理】APIM 配置Validate-JWT策略,验证RS256非对称(公钥/私钥)加密的Token
|
6月前
|
安全 NoSQL Java
JWT和Security 登录权限判断和token访问和让token失效
JWT和Security 登录权限判断和token访问和让token失效
|
缓存 前端开发 fastjson
Sa-Token中SerializationException
Sa-Token中SerializationException
90 1
|
安全 Java 数据库
SecurityOauth2密码模式/oauth/token探究
SecurityOauth2密码模式/oauth/token探究
420 0
|
缓存 安全 NoSQL
SpringBoot 如何使用 Sa-Token 完成权限认证?
SpringBoot 如何使用 Sa-Token 完成权限认证?
361 0