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