springboot+vue项目之使用Sa-Token框架实现权限和认证

一、Sa-Token简介

  Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证权限认证单点登录OAuth2.0分布式Session会话微服务网关鉴权 等一系列权限相关问题。更多内容和使用参考官方文档:Sa-Token 

二、Sa-Token在本项目的具体使用

1、导入依赖

        <!-- Sa-Token 权限认证,在线文档:https://sa-token.cc -->
        <dependency>
            <groupId>cn.dev33</groupId>
            <artifactId>sa-token-spring-boot-starter</artifactId>
            <version>1.37.0</version>
        </dependency>

        <!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
        <dependency>
            <groupId>cn.dev33</groupId>
            <artifactId>sa-token-redis-jackson</artifactId>
            <version>1.37.0</version>
        </dependency>

        <!-- 提供Redis连接池 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

2、application.yml文件配置

sa-token:
  #拦截器,获取令牌的键
  token-name: Authorization
  #将cookie禁用 不能在cookie里面的到值
  is-read-cookie: false
  is-read-body: false
  #token有效期,单位s,默认30天
  timeout: 3600000
  #token临时有效期(置顶时间内无操作就视为token过期) 单位s
  active-timeout: -1
  #在多人登录同一账号时,是否共用一个token
  is-share: false
  #是否允许同一个账号并发执行
  allow-concurrent-login: true

3、增加配置类 SaTokenConfigure.java

@Configuration
public class SaTokenConfigure {
    @Autowired
    public void rewriteSaStrategy() {
        // 重写Sa-Token的注解处理器,增加注解合并功能
        SaStrategy.instance.getAnnotation = (element, annotationClass) -> {
            return AnnotatedElementUtils.getMergedAnnotation(element, annotationClass);
        };
    }
}

4、Sa-Token 权限认证工具类之管理员 StpAdminUtil.java

  可以参考网址sa-token-demo/sa-token-demo-case/src/main/java/com/pj/satoken/StpUserUtil.java · dromara/Sa-Token - Gitee.com自行配置

@Component
public class StpAdminUtil {
    private StpAdminUtil() {}

    /**
     * 多账号体系下的类型标识
     */
    public static final String TYPE = "admin";

    /**
     * 底层使用的 StpLogic 对象
     */
    private static StpLogic stpLogic = new StpLogic(TYPE){
        //获取HttpServlet的令牌
        /**
         * 防止新登录的token会覆盖掉旧登录的token,从而导致旧登录失效。
         * @return
         */
//        @Override
//        public String splicingKeyTokenName() {
//            return super.splicingKeyTokenName()+"-admin";
//        }
        @Override
        public void checkLogin() {
            super.checkLogin();
        }
    };


    /**
     * 获取当前 StpLogic 的账号类型
     *
     * @return /
     */
    public static String getLoginType(){
        return stpLogic.getLoginType();
    }

    /**
     * 安全的重置 StpLogic 对象
     *
     * <br> 1、更改此账户的 StpLogic 对象
     * <br> 2、put 到全局 StpLogic 集合中
     * <br> 3、发送日志
     *
     * @param newStpLogic /
     */
    public static void setStpLogic(StpLogic newStpLogic) {
        // 1、重置此账户的 StpLogic 对象
        stpLogic = newStpLogic;

        // 2、添加到全局 StpLogic 集合中
        //    以便可以通过 SaManager.getStpLogic(type) 的方式来全局获取到这个 StpLogic
        SaManager.putStpLogic(newStpLogic);

        // 3、$$ 发布事件:更新了 stpLogic 对象
        SaTokenEventCenter.doSetStpLogic(stpLogic);
    }

    /**
     * 获取 StpLogic 对象
     *
     * @return /
     */
    public static StpLogic getStpLogic() {
        return stpLogic;
    }


    // ------------------- 获取 token 相关 -------------------

    /**
     * 返回 token 名称,此名称在以下地方体现:Cookie 保存 token 时的名称、提交 token 时参数的名称、存储 token 时的 key 前缀
     *
     * @return /
     */
    public static String getTokenName() {
        return stpLogic.getTokenName();
    }

    /**
     * 在当前会话写入指定 token 值
     *
     * @param tokenValue token 值
     */
    public static void setTokenValue(String tokenValue){
        stpLogic.setTokenValue(tokenValue);
    }

    /**
     * 在当前会话写入指定 token 值
     *
     * @param tokenValue token 值
     * @param cookieTimeout Cookie存活时间(秒)
     */
    public static void setTokenValue(String tokenValue, int cookieTimeout){
        stpLogic.setTokenValue(tokenValue, cookieTimeout);
    }

    /**
     * 在当前会话写入指定 token 值
     *
     * @param tokenValue token 值
     * @param loginModel 登录参数
     */
    public static void setTokenValue(String tokenValue, SaLoginModel loginModel){
        stpLogic.setTokenValue(tokenValue, loginModel);
    }

    /**
     * 获取当前请求的 token 值
     *
     * @return 当前tokenValue
     */
    public static String getTokenValue() {
        return stpLogic.getTokenValue();
    }

    /**
     * 获取当前请求的 token 值 (不裁剪前缀)
     *
     * @return /
     */
    public static String getTokenValueNotCut(){
        return stpLogic.getTokenValueNotCut();
    }

    /**
     * 获取当前会话的 token 参数信息
     *
     * @return token 参数信息
     */
    public static SaTokenInfo getTokenInfo() {
        return stpLogic.getTokenInfo();
    }


    // ------------------- 登录相关操作 -------------------

    // --- 登录

    /**
     * 会话登录
     *
     * @param id 账号id,建议的类型:(long | int | String)
     */
    public static void login(Object id) {
        stpLogic.login(id);
    }

    /**
     * 会话登录,并指定登录设备类型
     *
     * @param id 账号id,建议的类型:(long | int | String)
     * @param device 设备类型
     */
    public static void login(Object id, String device) {
        stpLogic.login(id, device);
    }

    /**
     * 会话登录,并指定是否 [记住我]
     *
     * @param id 账号id,建议的类型:(long | int | String)
     * @param isLastingCookie 是否为持久Cookie,值为 true 时记住我,值为 false 时关闭浏览器需要重新登录
     */
    public static void login(Object id, boolean isLastingCookie) {
        stpLogic.login(id, isLastingCookie);
    }

    /**
     * 会话登录,并指定此次登录 token 的有效期, 单位:秒
     *
     * @param id      账号id,建议的类型:(long | int | String)
     * @param timeout 此次登录 token 的有效期, 单位:秒
     */
    public static void login(Object id, long timeout) {
        stpLogic.login(id, timeout);
    }

    /**
     * 会话登录,并指定所有登录参数 Model
     *
     * @param id 账号id,建议的类型:(long | int | String)
     * @param loginModel 此次登录的参数Model
     */
    public static void login(Object id, SaLoginModel loginModel) {
        stpLogic.login(id, loginModel);
    }

    /**
     * 创建指定账号 id 的登录会话数据
     *
     * @param id 账号id,建议的类型:(long | int | String)
     * @return 返回会话令牌
     */
    public static String createLoginSession(Object id) {
        return stpLogic.createLoginSession(id);
    }

    /**
     * 创建指定账号 id 的登录会话数据
     *
     * @param id 账号id,建议的类型:(long | int | String)
     * @param loginModel 此次登录的参数Model
     * @return 返回会话令牌
     */
    public static String createLoginSession(Object id, SaLoginModel loginModel) {
        return stpLogic.createLoginSession(id, loginModel);
    }

    // --- 注销

    /**
     * 在当前客户端会话注销
     */
    public static void logout() {
        stpLogic.logout();
    }

    /**
     * 会话注销,根据账号id
     *
     * @param loginId 账号id
     */
    public static void logout(Object loginId) {
        stpLogic.logout(loginId);
    }

    /**
     * 会话注销,根据账号id 和 设备类型
     *
     * @param loginId 账号id
     * @param device 设备类型 (填 null 代表注销该账号的所有设备类型)
     */
    public static void logout(Object loginId, String device) {
        stpLogic.logout(loginId, device);
    }

    /**
     * 会话注销,根据指定 Token
     *
     * @param tokenValue 指定 token
     */
    public static void logoutByTokenValue(String tokenValue) {
        stpLogic.logoutByTokenValue(tokenValue);
    }

    /**
     * 踢人下线,根据账号id
     * <p> 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5 </p>
     *
     * @param loginId 账号id
     */
    public static void kickout(Object loginId) {
        stpLogic.kickout(loginId);
    }

    /**
     * 踢人下线,根据账号id 和 设备类型
     * <p> 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5 </p>
     *
     * @param loginId 账号id
     * @param device 设备类型 (填 null 代表踢出该账号的所有设备类型)
     */
    public static void kickout(Object loginId, String device) {
        stpLogic.kickout(loginId, device);
    }

    /**
     * 踢人下线,根据指定 token
     * <p> 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5 </p>
     *
     * @param tokenValue 指定 token
     */
    public static void kickoutByTokenValue(String tokenValue) {
        stpLogic.kickoutByTokenValue(tokenValue);
    }

    /**
     * 顶人下线,根据账号id 和 设备类型
     * <p> 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4 </p>
     *
     * @param loginId 账号id
     * @param device 设备类型 (填 null 代表顶替该账号的所有设备类型)
     */
    public static void replaced(Object loginId, String device) {
        stpLogic.replaced(loginId, device);
    }

    // 会话查询

    /**
     * 判断当前会话是否已经登录
     *
     * @return 已登录返回 true,未登录返回 false
     */
    public static boolean isLogin() {
        return stpLogic.isLogin();
    }

    /**
     * 检验当前会话是否已经登录,如未登录,则抛出异常
     */
    public static void checkLogin() {
        stpLogic.checkLogin();
    }

    /**
     * 获取当前会话账号id,如果未登录,则抛出异常
     *
     * @return 账号id
     */
    public static Object getLoginId() {
        return stpLogic.getLoginId();
    }

    /**
     * 获取当前会话账号id, 如果未登录,则返回默认值
     *
     * @param <T> 返回类型
     * @param defaultValue 默认值
     * @return 登录id
     */
    public static <T> T getLoginId(T defaultValue) {
        return stpLogic.getLoginId(defaultValue);
    }

    /**
     * 获取当前会话账号id, 如果未登录,则返回null
     *
     * @return 账号id
     */
    public static Object getLoginIdDefaultNull() {
        return stpLogic.getLoginIdDefaultNull();
    }

    /**
     * 获取当前会话账号id, 并转换为 String 类型
     *
     * @return 账号id
     */
    public static String getLoginIdAsString() {
        return stpLogic.getLoginIdAsString();
    }

    /**
     * 获取当前会话账号id, 并转换为 int 类型
     *
     * @return 账号id
     */
    public static int getLoginIdAsInt() {
        return stpLogic.getLoginIdAsInt();
    }

    /**
     * 获取当前会话账号id, 并转换为 long 类型
     *
     * @return 账号id
     */
    public static long getLoginIdAsLong() {
        return stpLogic.getLoginIdAsLong();
    }

    /**
     * 获取指定 token 对应的账号id,如果未登录,则返回 null
     *
     * @param tokenValue token
     * @return 账号id
     */
    public static Object getLoginIdByToken(String tokenValue) {
        return stpLogic.getLoginIdByToken(tokenValue);
    }

    /**
     * 获取当前 Token 的扩展信息(此函数只在jwt模式下生效)
     *
     * @param key 键值
     * @return 对应的扩展数据
     */
    public static Object getExtra(String key) {
        return stpLogic.getExtra(key);
    }

    /**
     * 获取指定 Token 的扩展信息(此函数只在jwt模式下生效)
     *
     * @param tokenValue 指定的 Token 值
     * @param key 键值
     * @return 对应的扩展数据
     */
    public static Object getExtra(String tokenValue, String key) {
        return stpLogic.getExtra(tokenValue, key);
    }


    // ------------------- Account-Session 相关 -------------------

    /**
     * 获取指定账号 id 的 Account-Session, 如果该 SaSession 尚未创建,isCreate=是否新建并返回
     *
     * @param loginId 账号id
     * @param isCreate 是否新建
     * @return SaSession 对象
     */
    public static SaSession getSessionByLoginId(Object loginId, boolean isCreate) {
        return stpLogic.getSessionByLoginId(loginId, isCreate);
    }

    /**
     * 获取指定 key 的 SaSession, 如果该 SaSession 尚未创建,则返回 null
     *
     * @param sessionId SessionId
     * @return Session对象
     */
    public static SaSession getSessionBySessionId(String sessionId) {
        return stpLogic.getSessionBySessionId(sessionId);
    }

    /**
     * 获取指定账号 id 的 Account-Session,如果该 SaSession 尚未创建,则新建并返回
     *
     * @param loginId 账号id
     * @return SaSession 对象
     */
    public static SaSession getSessionByLoginId(Object loginId) {
        return stpLogic.getSessionByLoginId(loginId);
    }

    /**
     * 获取当前已登录账号的 Account-Session, 如果该 SaSession 尚未创建,isCreate=是否新建并返回
     *
     * @param isCreate 是否新建
     * @return Session对象
     */
    public static SaSession getSession(boolean isCreate) {
        return stpLogic.getSession(isCreate);
    }

    /**
     * 获取当前已登录账号的 Account-Session,如果该 SaSession 尚未创建,则新建并返回
     *
     * @return Session对象
     */
    public static SaSession getSession() {
        return stpLogic.getSession();
    }


    // ------------------- Token-Session 相关 -------------------

    /**
     * 获取指定 token 的 Token-Session,如果该 SaSession 尚未创建,则新建并返回
     *
     * @param tokenValue Token值
     * @return Session对象
     */
    public static SaSession getTokenSessionByToken(String tokenValue) {
        return stpLogic.getTokenSessionByToken(tokenValue);
    }

    /**
     * 获取当前 token 的 Token-Session,如果该 SaSession 尚未创建,则新建并返回
     *
     * @return Session对象
     */
    public static SaSession getTokenSession() {
        return stpLogic.getTokenSession();
    }

    /**
     * 获取当前匿名 Token-Session (可在未登录情况下使用的Token-Session)
     *
     * @return Token-Session 对象
     */
    public static SaSession getAnonTokenSession() {
        return stpLogic.getAnonTokenSession();
    }


    // ------------------- Active-Timeout token 最低活跃度 验证相关 -------------------

    /**
     * 续签当前 token:(将 [最后操作时间] 更新为当前时间戳)
     * <h2>
     * 		请注意: 即使 token 已被冻结 也可续签成功,
     * 		如果此场景下需要提示续签失败,可在此之前调用 checkActiveTimeout() 强制检查是否冻结即可
     * </h2>
     */
    public static void updateLastActiveToNow() {
        stpLogic.updateLastActiveToNow();
    }

    /**
     * 检查当前 token 是否已被冻结,如果是则抛出异常
     */
    public static void checkActiveTimeout() {
        stpLogic.checkActiveTimeout();
    }


    // ------------------- 过期时间相关 -------------------

    /**
     * 获取当前会话 token 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值)
     *
     * @return token剩余有效时间
     */
    public static long getTokenTimeout() {
        return stpLogic.getTokenTimeout();
    }

    /**
     * 获取指定 token 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值)
     *
     * @param token 指定token
     * @return token剩余有效时间
     */
    public static long getTokenTimeout(String token) {
        return stpLogic.getTokenTimeout(token);
    }

    /**
     * 获取当前登录账号的 Account-Session 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值)
     *
     * @return token剩余有效时间
     */
    public static long getSessionTimeout() {
        return stpLogic.getSessionTimeout();
    }

    /**
     * 获取当前 token 的 Token-Session 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值)
     *
     * @return token剩余有效时间
     */
    public static long getTokenSessionTimeout() {
        return stpLogic.getTokenSessionTimeout();
    }

    /**
     * 获取当前 token 剩余活跃有效期:当前 token 距离被冻结还剩多少时间(单位: 秒,返回 -1 代表永不冻结,-2 代表没有这个值或 token 已被冻结了)
     *
     * @return /
     */
    public static long getTokenActiveTimeout() {
        return stpLogic.getTokenActiveTimeout();
    }

    /**
     * 对当前 token 的 timeout 值进行续期
     *
     * @param timeout 要修改成为的有效时间 (单位: 秒)
     */
    public static void renewTimeout(long timeout) {
        stpLogic.renewTimeout(timeout);
    }

    /**
     * 对指定 token 的 timeout 值进行续期
     *
     * @param tokenValue 指定 token
     * @param timeout 要修改成为的有效时间 (单位: 秒,填 -1 代表要续为永久有效)
     */
    public static void renewTimeout(String tokenValue, long timeout) {
        stpLogic.renewTimeout(tokenValue, timeout);
    }


    // ------------------- 角色认证操作 -------------------

    /**
     * 获取:当前账号的角色集合
     *
     * @return /
     */
    public static List<String> getRoleList() {
        return stpLogic.getRoleList();
    }

    /**
     * 获取:指定账号的角色集合
     *
     * @param loginId 指定账号id
     * @return /
     */
    public static List<String> getRoleList(Object loginId) {
        return stpLogic.getRoleList(loginId);
    }

    /**
     * 判断:当前账号是否拥有指定角色, 返回 true 或 false
     *
     * @param role 角色
     * @return /
     */
    public static boolean hasRole(String role) {
        return stpLogic.hasRole(role);
    }

    /**
     * 判断:指定账号是否含有指定角色标识, 返回 true 或 false
     *
     * @param loginId 账号id
     * @param role 角色标识
     * @return 是否含有指定角色标识
     */
    public static boolean hasRole(Object loginId, String role) {
        return stpLogic.hasRole(loginId, role);
    }

    /**
     * 判断:当前账号是否含有指定角色标识 [ 指定多个,必须全部验证通过 ]
     *
     * @param roleArray 角色标识数组
     * @return true或false
     */
    public static boolean hasRoleAnd(String... roleArray){
        return stpLogic.hasRoleAnd(roleArray);
    }

    /**
     * 判断:当前账号是否含有指定角色标识 [ 指定多个,只要其一验证通过即可 ]
     *
     * @param roleArray 角色标识数组
     * @return true或false
     */
    public static boolean hasRoleOr(String... roleArray){
        return stpLogic.hasRoleOr(roleArray);
    }

    /**
     * 校验:当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException
     *
     * @param role 角色标识
     */
    public static void checkRole(String role) {
        stpLogic.checkRole(role);
    }

    /**
     * 校验:当前账号是否含有指定角色标识 [ 指定多个,必须全部验证通过 ]
     *
     * @param roleArray 角色标识数组
     */
    public static void checkRoleAnd(String... roleArray){
        stpLogic.checkRoleAnd(roleArray);
    }

    /**
     * 校验:当前账号是否含有指定角色标识 [ 指定多个,只要其一验证通过即可 ]
     *
     * @param roleArray 角色标识数组
     */
    public static void checkRoleOr(String... roleArray){
        stpLogic.checkRoleOr(roleArray);
    }


    // ------------------- 权限认证操作 -------------------

    /**
     * 获取:当前账号的权限码集合
     *
     * @return /
     */
    public static List<String> getPermissionList() {
        return stpLogic.getPermissionList();
    }

    /**
     * 获取:指定账号的权限码集合
     *
     * @param loginId 指定账号id
     * @return /
     */
    public static List<String> getPermissionList(Object loginId) {
        return stpLogic.getPermissionList(loginId);
    }

    /**
     * 判断:当前账号是否含有指定权限, 返回 true 或 false
     *
     * @param permission 权限码
     * @return 是否含有指定权限
     */
    public static boolean hasPermission(String permission) {
        return stpLogic.hasPermission(permission);
    }

    /**
     * 判断:指定账号 id 是否含有指定权限, 返回 true 或 false
     *
     * @param loginId 账号 id
     * @param permission 权限码
     * @return 是否含有指定权限
     */
    public static boolean hasPermission(Object loginId, String permission) {
        return stpLogic.hasPermission(loginId, permission);
    }

    /**
     * 判断:当前账号是否含有指定权限 [ 指定多个,必须全部具有 ]
     *
     * @param permissionArray 权限码数组
     * @return true 或 false
     */
    public static boolean hasPermissionAnd(String... permissionArray){
        return stpLogic.hasPermissionAnd(permissionArray);
    }

    /**
     * 判断:当前账号是否含有指定权限 [ 指定多个,只要其一验证通过即可 ]
     *
     * @param permissionArray 权限码数组
     * @return true 或 false
     */
    public static boolean hasPermissionOr(String... permissionArray){
        return stpLogic.hasPermissionOr(permissionArray);
    }

    /**
     * 校验:当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException
     *
     * @param permission 权限码
     */
    public static void checkPermission(String permission) {
        stpLogic.checkPermission(permission);
    }

    /**
     * 校验:当前账号是否含有指定权限 [ 指定多个,必须全部验证通过 ]
     *
     * @param permissionArray 权限码数组
     */
    public static void checkPermissionAnd(String... permissionArray) {
        stpLogic.checkPermissionAnd(permissionArray);
    }

    /**
     * 校验:当前账号是否含有指定权限 [ 指定多个,只要其一验证通过即可 ]
     *
     * @param permissionArray 权限码数组
     */
    public static void checkPermissionOr(String... permissionArray) {
        stpLogic.checkPermissionOr(permissionArray);
    }


    // ------------------- id 反查 token 相关操作 -------------------

    /**
     * 获取指定账号 id 的 token
     * <p>
     * 		在配置为允许并发登录时,此方法只会返回队列的最后一个 token,
     * 		如果你需要返回此账号 id 的所有 token,请调用 getTokenValueListByLoginId
     * </p>
     *
     * @param loginId 账号id
     * @return token值
     */
    public static String getTokenValueByLoginId(Object loginId) {
        return stpLogic.getTokenValueByLoginId(loginId);
    }

    /**
     * 获取指定账号 id 指定设备类型端的 token
     * <p>
     * 		在配置为允许并发登录时,此方法只会返回队列的最后一个 token,
     * 		如果你需要返回此账号 id 的所有 token,请调用 getTokenValueListByLoginId
     * </p>
     *
     * @param loginId 账号id
     * @param device 设备类型,填 null 代表不限设备类型
     * @return token值
     */
    public static String getTokenValueByLoginId(Object loginId, String device) {
        return stpLogic.getTokenValueByLoginId(loginId, device);
    }

    /**
     * 获取指定账号 id 的 token 集合
     *
     * @param loginId 账号id
     * @return 此 loginId 的所有相关 token
     */
    public static List<String> getTokenValueListByLoginId(Object loginId) {
        return stpLogic.getTokenValueListByLoginId(loginId);
    }

    /**
     * 获取指定账号 id 指定设备类型端的 token 集合
     *
     * @param loginId 账号id
     * @param device 设备类型,填 null 代表不限设备类型
     * @return 此 loginId 的所有登录 token
     */
    public static List<String> getTokenValueListByLoginId(Object loginId, String device) {
        return stpLogic.getTokenValueListByLoginId(loginId, device);
    }

    /**
     * 返回当前会话的登录设备类型
     *
     * @return 当前令牌的登录设备类型
     */
    public static String getLoginDevice() {
        return stpLogic.getLoginDevice();
    }


    // ------------------- 会话管理 -------------------

    /**
     * 根据条件查询缓存中所有的 token
     *
     * @param keyword 关键字
     * @param start 开始处索引
     * @param size 获取数量 (-1代表一直获取到末尾)
     * @param sortType 排序类型(true=正序,false=反序)
     *
     * @return token集合
     */
    public static List<String> searchTokenValue(String keyword, int start, int size, boolean sortType) {
        return stpLogic.searchTokenValue(keyword, start, size, sortType);
    }

    /**
     * 根据条件查询缓存中所有的 SessionId
     *
     * @param keyword 关键字
     * @param start 开始处索引
     * @param size 获取数量  (-1代表一直获取到末尾)
     * @param sortType 排序类型(true=正序,false=反序)
     *
     * @return sessionId集合
     */
    public static List<String> searchSessionId(String keyword, int start, int size, boolean sortType) {
        return stpLogic.searchSessionId(keyword, start, size, sortType);
    }

    /**
     * 根据条件查询缓存中所有的 Token-Session-Id
     *
     * @param keyword 关键字
     * @param start 开始处索引
     * @param size 获取数量 (-1代表一直获取到末尾)
     * @param sortType 排序类型(true=正序,false=反序)
     *
     * @return sessionId集合
     */
    public static List<String> searchTokenSessionId(String keyword, int start, int size, boolean sortType) {
        return stpLogic.searchTokenSessionId(keyword, start, size, sortType);
    }


    // ------------------- 账号封禁 -------------------

    /**
     * 封禁:指定账号
     * <p> 此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id)
     *
     * @param loginId 指定账号id
     * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
     */
    public static void disable(Object loginId, long time) {
        stpLogic.disable(loginId, time);
    }

    /**
     * 判断:指定账号是否已被封禁 (true=已被封禁, false=未被封禁)
     *
     * @param loginId 账号id
     * @return /
     */
    public static boolean isDisable(Object loginId) {
        return stpLogic.isDisable(loginId);
    }

    /**
     * 校验:指定账号是否已被封禁,如果被封禁则抛出异常
     *
     * @param loginId 账号id
     */
    public static void checkDisable(Object loginId) {
        stpLogic.checkDisable(loginId);
    }

    /**
     * 获取:指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
     *
     * @param loginId 账号id
     * @return /
     */
    public static long getDisableTime(Object loginId) {
        return stpLogic.getDisableTime(loginId);
    }

    /**
     * 解封:指定账号
     *
     * @param loginId 账号id
     */
    public static void untieDisable(Object loginId) {
        stpLogic.untieDisable(loginId);
    }


    // ------------------- 分类封禁 -------------------

    /**
     * 封禁:指定账号的指定服务
     * <p> 此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id)
     *
     * @param loginId 指定账号id
     * @param service 指定服务
     * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
     */
    public static void disable(Object loginId, String service, long time) {
        stpLogic.disable(loginId, service, time);
    }

    /**
     * 判断:指定账号的指定服务 是否已被封禁(true=已被封禁, false=未被封禁)
     *
     * @param loginId 账号id
     * @param service 指定服务
     * @return /
     */
    public static boolean isDisable(Object loginId, String service) {
        return stpLogic.isDisable(loginId, service);
    }

    /**
     * 校验:指定账号 指定服务 是否已被封禁,如果被封禁则抛出异常
     *
     * @param loginId 账号id
     * @param services 指定服务,可以指定多个
     */
    public static void checkDisable(Object loginId, String... services) {
        stpLogic.checkDisable(loginId, services);
    }

    /**
     * 获取:指定账号 指定服务 剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
     *
     * @param loginId 账号id
     * @param service 指定服务
     * @return see note
     */
    public static long getDisableTime(Object loginId, String service) {
        return stpLogic.getDisableTime(loginId, service);
    }

    /**
     * 解封:指定账号、指定服务
     *
     * @param loginId 账号id
     * @param services 指定服务,可以指定多个
     */
    public static void untieDisable(Object loginId, String... services) {
        stpLogic.untieDisable(loginId, services);
    }


    // ------------------- 阶梯封禁 -------------------

    /**
     * 封禁:指定账号,并指定封禁等级
     *
     * @param loginId 指定账号id
     * @param level 指定封禁等级
     * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
     */
    public static void disableLevel(Object loginId, int level, long time) {
        stpLogic.disableLevel(loginId, level, time);
    }

    /**
     * 封禁:指定账号的指定服务,并指定封禁等级
     *
     * @param loginId 指定账号id
     * @param service 指定封禁服务
     * @param level 指定封禁等级
     * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
     */
    public static void disableLevel(Object loginId, String service, int level, long time) {
        stpLogic.disableLevel(loginId, service, level, time);
    }

    /**
     * 判断:指定账号是否已被封禁到指定等级
     *
     * @param loginId 指定账号id
     * @param level 指定封禁等级
     * @return /
     */
    public static boolean isDisableLevel(Object loginId, int level) {
        return stpLogic.isDisableLevel(loginId, level);
    }

    /**
     * 判断:指定账号的指定服务,是否已被封禁到指定等级
     *
     * @param loginId 指定账号id
     * @param service 指定封禁服务
     * @param level 指定封禁等级
     * @return /
     */
    public static boolean isDisableLevel(Object loginId, String service, int level) {
        return stpLogic.isDisableLevel(loginId, service, level);
    }

    /**
     * 校验:指定账号是否已被封禁到指定等级(如果已经达到,则抛出异常)
     *
     * @param loginId 指定账号id
     * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常)
     */
    public static void checkDisableLevel(Object loginId, int level) {
        stpLogic.checkDisableLevel(loginId, level);
    }

    /**
     * 校验:指定账号的指定服务,是否已被封禁到指定等级(如果已经达到,则抛出异常)
     *
     * @param loginId 指定账号id
     * @param service 指定封禁服务
     * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常)
     */
    public static void checkDisableLevel(Object loginId, String service, int level) {
        stpLogic.checkDisableLevel(loginId, service, level);
    }

    /**
     * 获取:指定账号被封禁的等级,如果未被封禁则返回-2
     *
     * @param loginId 指定账号id
     * @return /
     */
    public static int getDisableLevel(Object loginId) {
        return stpLogic.getDisableLevel(loginId);
    }

    /**
     * 获取:指定账号的 指定服务 被封禁的等级,如果未被封禁则返回-2
     *
     * @param loginId 指定账号id
     * @param service 指定封禁服务
     * @return /
     */
    public static int getDisableLevel(Object loginId, String service) {
        return stpLogic.getDisableLevel(loginId, service);
    }


    // ------------------- 临时身份切换 -------------------

    /**
     * 临时切换身份为指定账号id
     *
     * @param loginId 指定loginId
     */
    public static void switchTo(Object loginId) {
        stpLogic.switchTo(loginId);
    }

    /**
     * 结束临时切换身份
     */
    public static void endSwitch() {
        stpLogic.endSwitch();
    }

    /**
     * 判断当前请求是否正处于 [ 身份临时切换 ] 中
     *
     * @return /
     */
    public static boolean isSwitch() {
        return stpLogic.isSwitch();
    }

    /**
     * 在一个 lambda 代码段里,临时切换身份为指定账号id,lambda 结束后自动恢复
     *
     * @param loginId 指定账号id
     * @param function 要执行的方法
     */
    public static void switchTo(Object loginId, SaFunction function) {
        stpLogic.switchTo(loginId, function);
    }


    // ------------------- 二级认证 -------------------

    /**
     * 在当前会话 开启二级认证
     *
     * @param safeTime 维持时间 (单位: 秒)
     */
    public static void openSafe(long safeTime) {
        stpLogic.openSafe(safeTime);
    }

    /**
     * 在当前会话 开启二级认证
     *
     * @param service 业务标识
     * @param safeTime 维持时间 (单位: 秒)
     */
    public static void openSafe(String service, long safeTime) {
        stpLogic.openSafe(service, safeTime);
    }

    /**
     * 判断:当前会话是否处于二级认证时间内
     *
     * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时
     */
    public static boolean isSafe() {
        return stpLogic.isSafe();
    }

    /**
     * 判断:当前会话 是否处于指定业务的二级认证时间内
     *
     * @param service 业务标识
     * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时
     */
    public static boolean isSafe(String service) {
        return stpLogic.isSafe(service);
    }

    /**
     * 判断:指定 token 是否处于二级认证时间内
     *
     * @param tokenValue Token 值
     * @param service 业务标识
     * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时
     */
    public static boolean isSafe(String tokenValue, String service) {
        return stpLogic.isSafe(tokenValue, service);
    }

    /**
     * 校验:当前会话是否已通过二级认证,如未通过则抛出异常
     */
    public static void checkSafe() {
        stpLogic.checkSafe();
    }

    /**
     * 校验:检查当前会话是否已通过指定业务的二级认证,如未通过则抛出异常
     *
     * @param service 业务标识
     */
    public static void checkSafe(String service) {
        stpLogic.checkSafe(service);
    }

    /**
     * 获取:当前会话的二级认证剩余有效时间(单位: 秒, 返回-2代表尚未通过二级认证)
     *
     * @return 剩余有效时间
     */
    public static long getSafeTime() {
        return stpLogic.getSafeTime();
    }

    /**
     * 获取:当前会话的二级认证剩余有效时间(单位: 秒, 返回-2代表尚未通过二级认证)
     *
     * @param service 业务标识
     * @return 剩余有效时间
     */
    public static long getSafeTime(String service) {
        return stpLogic.getSafeTime(service);
    }

    /**
     * 在当前会话 结束二级认证
     */
    public static void closeSafe() {
        stpLogic.closeSafe();
    }

    /**
     * 在当前会话 结束指定业务标识的二级认证
     *
     * @param service 业务标识
     */
    public static void closeSafe(String service) {
        stpLogic.closeSafe(service);
    }
}

5、 Sa-Token 权限认证工具类之管理员 StpAdminUtil.java

@Component
public class StpMerchandiserUtil {
    private StpMerchandiserUtil() {}

    /**
     * 多账号体系下的类型标识
     */
    public static final String TYPE = "merchandiser";

    /**
     * 底层使用的 StpLogic 对象
     */
    private static StpLogic stpLogic = new StpLogic(TYPE){
        @Override
        public void checkLogin() {
            super.checkLogin();
        }


    };

    /**
     * 获取当前 StpLogic 的账号类型
     *
     * @return /
     */
    public static String getLoginType(){
        return stpLogic.getLoginType();
    }

    /**
     * 安全的重置 StpLogic 对象
     *
     * <br> 1、更改此账户的 StpLogic 对象
     * <br> 2、put 到全局 StpLogic 集合中
     * <br> 3、发送日志
     *
     * @param newStpLogic /
     */
    public static void setStpLogic(StpLogic newStpLogic) {
        // 1、重置此账户的 StpLogic 对象
        stpLogic = newStpLogic;

        // 2、添加到全局 StpLogic 集合中
        //    以便可以通过 SaManager.getStpLogic(type) 的方式来全局获取到这个 StpLogic
        SaManager.putStpLogic(newStpLogic);

        // 3、$$ 发布事件:更新了 stpLogic 对象
        SaTokenEventCenter.doSetStpLogic(stpLogic);
    }

    /**
     * 获取 StpLogic 对象
     *
     * @return /
     */
    public static StpLogic getStpLogic() {
        return stpLogic;
    }


    // ------------------- 获取 token 相关 -------------------

    /**
     * 返回 token 名称,此名称在以下地方体现:Cookie 保存 token 时的名称、提交 token 时参数的名称、存储 token 时的 key 前缀
     *
     * @return /
     */
    public static String getTokenName() {
        return stpLogic.getTokenName();
    }

    /**
     * 在当前会话写入指定 token 值
     *
     * @param tokenValue token 值
     */
    public static void setTokenValue(String tokenValue){
        stpLogic.setTokenValue(tokenValue);
    }

    /**
     * 在当前会话写入指定 token 值
     *
     * @param tokenValue token 值
     * @param cookieTimeout Cookie存活时间(秒)
     */
    public static void setTokenValue(String tokenValue, int cookieTimeout){
        stpLogic.setTokenValue(tokenValue, cookieTimeout);
    }

    /**
     * 在当前会话写入指定 token 值
     *
     * @param tokenValue token 值
     * @param loginModel 登录参数
     */
    public static void setTokenValue(String tokenValue, SaLoginModel loginModel){
        stpLogic.setTokenValue(tokenValue, loginModel);
    }

    /**
     * 获取当前请求的 token 值
     *
     * @return 当前tokenValue
     */
    public static String getTokenValue() {
        return stpLogic.getTokenValue();
    }

    /**
     * 获取当前请求的 token 值 (不裁剪前缀)
     *
     * @return /
     */
    public static String getTokenValueNotCut(){
        return stpLogic.getTokenValueNotCut();
    }

    /**
     * 获取当前会话的 token 参数信息
     *
     * @return token 参数信息
     */
    public static SaTokenInfo getTokenInfo() {
        return stpLogic.getTokenInfo();
    }


    // ------------------- 登录相关操作 -------------------

    // --- 登录

    /**
     * 会话登录
     *
     * @param id 账号id,建议的类型:(long | int | String)
     */
    public static void login(Object id) {
        stpLogic.login(id);
    }

    /**
     * 会话登录,并指定登录设备类型
     *
     * @param id 账号id,建议的类型:(long | int | String)
     * @param device 设备类型
     */
    public static void login(Object id, String device) {
        stpLogic.login(id, device);
    }

    /**
     * 会话登录,并指定是否 [记住我]
     *
     * @param id 账号id,建议的类型:(long | int | String)
     * @param isLastingCookie 是否为持久Cookie,值为 true 时记住我,值为 false 时关闭浏览器需要重新登录
     */
    public static void login(Object id, boolean isLastingCookie) {
        stpLogic.login(id, isLastingCookie);
    }

    /**
     * 会话登录,并指定此次登录 token 的有效期, 单位:秒
     *
     * @param id      账号id,建议的类型:(long | int | String)
     * @param timeout 此次登录 token 的有效期, 单位:秒
     */
    public static void login(Object id, long timeout) {
        stpLogic.login(id, timeout);
    }

    /**
     * 会话登录,并指定所有登录参数 Model
     *
     * @param id 账号id,建议的类型:(long | int | String)
     * @param loginModel 此次登录的参数Model
     */
    public static void login(Object id, SaLoginModel loginModel) {
        stpLogic.login(id, loginModel);
    }

    /**
     * 创建指定账号 id 的登录会话数据
     *
     * @param id 账号id,建议的类型:(long | int | String)
     * @return 返回会话令牌
     */
    public static String createLoginSession(Object id) {
        return stpLogic.createLoginSession(id);
    }

    /**
     * 创建指定账号 id 的登录会话数据
     *
     * @param id 账号id,建议的类型:(long | int | String)
     * @param loginModel 此次登录的参数Model
     * @return 返回会话令牌
     */
    public static String createLoginSession(Object id, SaLoginModel loginModel) {
        return stpLogic.createLoginSession(id, loginModel);
    }

    // --- 注销

    /**
     * 在当前客户端会话注销
     */
    public static void logout() {
        stpLogic.logout();
    }

    /**
     * 会话注销,根据账号id
     *
     * @param loginId 账号id
     */
    public static void logout(Object loginId) {
        stpLogic.logout(loginId);
    }

    /**
     * 会话注销,根据账号id 和 设备类型
     *
     * @param loginId 账号id
     * @param device 设备类型 (填 null 代表注销该账号的所有设备类型)
     */
    public static void logout(Object loginId, String device) {
        stpLogic.logout(loginId, device);
    }

    /**
     * 会话注销,根据指定 Token
     *
     * @param tokenValue 指定 token
     */
    public static void logoutByTokenValue(String tokenValue) {
        stpLogic.logoutByTokenValue(tokenValue);
    }

    /**
     * 踢人下线,根据账号id
     * <p> 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5 </p>
     *
     * @param loginId 账号id
     */
    public static void kickout(Object loginId) {
        stpLogic.kickout(loginId);
    }

    /**
     * 踢人下线,根据账号id 和 设备类型
     * <p> 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5 </p>
     *
     * @param loginId 账号id
     * @param device 设备类型 (填 null 代表踢出该账号的所有设备类型)
     */
    public static void kickout(Object loginId, String device) {
        stpLogic.kickout(loginId, device);
    }

    /**
     * 踢人下线,根据指定 token
     * <p> 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-5 </p>
     *
     * @param tokenValue 指定 token
     */
    public static void kickoutByTokenValue(String tokenValue) {
        stpLogic.kickoutByTokenValue(tokenValue);
    }

    /**
     * 顶人下线,根据账号id 和 设备类型
     * <p> 当对方再次访问系统时,会抛出 NotLoginException 异常,场景值=-4 </p>
     *
     * @param loginId 账号id
     * @param device 设备类型 (填 null 代表顶替该账号的所有设备类型)
     */
    public static void replaced(Object loginId, String device) {
        stpLogic.replaced(loginId, device);
    }

    // 会话查询

    /**
     * 判断当前会话是否已经登录
     *
     * @return 已登录返回 true,未登录返回 false
     */
    public static boolean isLogin() {
        return stpLogic.isLogin();
    }

    /**
     * 检验当前会话是否已经登录,如未登录,则抛出异常
     */
    public static void checkLogin() {
        stpLogic.checkLogin();
    }

    /**
     * 获取当前会话账号id,如果未登录,则抛出异常
     *
     * @return 账号id
     */
    public static Object getLoginId() {
        return stpLogic.getLoginId();
    }

    /**
     * 获取当前会话账号id, 如果未登录,则返回默认值
     *
     * @param <T> 返回类型
     * @param defaultValue 默认值
     * @return 登录id
     */
    public static <T> T getLoginId(T defaultValue) {
        return stpLogic.getLoginId(defaultValue);
    }

    /**
     * 获取当前会话账号id, 如果未登录,则返回null
     *
     * @return 账号id
     */
    public static Object getLoginIdDefaultNull() {
        return stpLogic.getLoginIdDefaultNull();
    }

    /**
     * 获取当前会话账号id, 并转换为 String 类型
     *
     * @return 账号id
     */
    public static String getLoginIdAsString() {
        return stpLogic.getLoginIdAsString();
    }

    /**
     * 获取当前会话账号id, 并转换为 int 类型
     *
     * @return 账号id
     */
    public static int getLoginIdAsInt() {
        return stpLogic.getLoginIdAsInt();
    }

    /**
     * 获取当前会话账号id, 并转换为 long 类型
     *
     * @return 账号id
     */
    public static long getLoginIdAsLong() {
        return stpLogic.getLoginIdAsLong();
    }

    /**
     * 获取指定 token 对应的账号id,如果未登录,则返回 null
     *
     * @param tokenValue token
     * @return 账号id
     */
    public static Object getLoginIdByToken(String tokenValue) {
        return stpLogic.getLoginIdByToken(tokenValue);
    }

    /**
     * 获取当前 Token 的扩展信息(此函数只在jwt模式下生效)
     *
     * @param key 键值
     * @return 对应的扩展数据
     */
    public static Object getExtra(String key) {
        return stpLogic.getExtra(key);
    }

    /**
     * 获取指定 Token 的扩展信息(此函数只在jwt模式下生效)
     *
     * @param tokenValue 指定的 Token 值
     * @param key 键值
     * @return 对应的扩展数据
     */
    public static Object getExtra(String tokenValue, String key) {
        return stpLogic.getExtra(tokenValue, key);
    }


    // ------------------- Account-Session 相关 -------------------

    /**
     * 获取指定账号 id 的 Account-Session, 如果该 SaSession 尚未创建,isCreate=是否新建并返回
     *
     * @param loginId 账号id
     * @param isCreate 是否新建
     * @return SaSession 对象
     */
    public static SaSession getSessionByLoginId(Object loginId, boolean isCreate) {
        return stpLogic.getSessionByLoginId(loginId, isCreate);
    }

    /**
     * 获取指定 key 的 SaSession, 如果该 SaSession 尚未创建,则返回 null
     *
     * @param sessionId SessionId
     * @return Session对象
     */
    public static SaSession getSessionBySessionId(String sessionId) {
        return stpLogic.getSessionBySessionId(sessionId);
    }

    /**
     * 获取指定账号 id 的 Account-Session,如果该 SaSession 尚未创建,则新建并返回
     *
     * @param loginId 账号id
     * @return SaSession 对象
     */
    public static SaSession getSessionByLoginId(Object loginId) {
        return stpLogic.getSessionByLoginId(loginId);
    }

    /**
     * 获取当前已登录账号的 Account-Session, 如果该 SaSession 尚未创建,isCreate=是否新建并返回
     *
     * @param isCreate 是否新建
     * @return Session对象
     */
    public static SaSession getSession(boolean isCreate) {
        return stpLogic.getSession(isCreate);
    }

    /**
     * 获取当前已登录账号的 Account-Session,如果该 SaSession 尚未创建,则新建并返回
     *
     * @return Session对象
     */
    public static SaSession getSession() {
        return stpLogic.getSession();
    }


    // ------------------- Token-Session 相关 -------------------

    /**
     * 获取指定 token 的 Token-Session,如果该 SaSession 尚未创建,则新建并返回
     *
     * @param tokenValue Token值
     * @return Session对象
     */
    public static SaSession getTokenSessionByToken(String tokenValue) {
        return stpLogic.getTokenSessionByToken(tokenValue);
    }

    /**
     * 获取当前 token 的 Token-Session,如果该 SaSession 尚未创建,则新建并返回
     *
     * @return Session对象
     */
    public static SaSession getTokenSession() {
        return stpLogic.getTokenSession();
    }

    /**
     * 获取当前匿名 Token-Session (可在未登录情况下使用的Token-Session)
     *
     * @return Token-Session 对象
     */
    public static SaSession getAnonTokenSession() {
        return stpLogic.getAnonTokenSession();
    }


    // ------------------- Active-Timeout token 最低活跃度 验证相关 -------------------

    /**
     * 续签当前 token:(将 [最后操作时间] 更新为当前时间戳)
     * <h2>
     * 		请注意: 即使 token 已被冻结 也可续签成功,
     * 		如果此场景下需要提示续签失败,可在此之前调用 checkActiveTimeout() 强制检查是否冻结即可
     * </h2>
     */
    public static void updateLastActiveToNow() {
        stpLogic.updateLastActiveToNow();
    }

    /**
     * 检查当前 token 是否已被冻结,如果是则抛出异常
     */
    public static void checkActiveTimeout() {
        stpLogic.checkActiveTimeout();
    }


    // ------------------- 过期时间相关 -------------------

    /**
     * 获取当前会话 token 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值)
     *
     * @return token剩余有效时间
     */
    public static long getTokenTimeout() {
        return stpLogic.getTokenTimeout();
    }

    /**
     * 获取指定 token 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值)
     *
     * @param token 指定token
     * @return token剩余有效时间
     */
    public static long getTokenTimeout(String token) {
        return stpLogic.getTokenTimeout(token);
    }

    /**
     * 获取当前登录账号的 Account-Session 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值)
     *
     * @return token剩余有效时间
     */
    public static long getSessionTimeout() {
        return stpLogic.getSessionTimeout();
    }

    /**
     * 获取当前 token 的 Token-Session 剩余有效时间(单位: 秒,返回 -1 代表永久有效,-2 代表没有这个值)
     *
     * @return token剩余有效时间
     */
    public static long getTokenSessionTimeout() {
        return stpLogic.getTokenSessionTimeout();
    }

    /**
     * 获取当前 token 剩余活跃有效期:当前 token 距离被冻结还剩多少时间(单位: 秒,返回 -1 代表永不冻结,-2 代表没有这个值或 token 已被冻结了)
     *
     * @return /
     */
    public static long getTokenActiveTimeout() {
        return stpLogic.getTokenActiveTimeout();
    }

    /**
     * 对当前 token 的 timeout 值进行续期
     *
     * @param timeout 要修改成为的有效时间 (单位: 秒)
     */
    public static void renewTimeout(long timeout) {
        stpLogic.renewTimeout(timeout);
    }

    /**
     * 对指定 token 的 timeout 值进行续期
     *
     * @param tokenValue 指定 token
     * @param timeout 要修改成为的有效时间 (单位: 秒,填 -1 代表要续为永久有效)
     */
    public static void renewTimeout(String tokenValue, long timeout) {
        stpLogic.renewTimeout(tokenValue, timeout);
    }


    // ------------------- 角色认证操作 -------------------

    /**
     * 获取:当前账号的角色集合
     *
     * @return /
     */
    public static List<String> getRoleList() {
        return stpLogic.getRoleList();
    }

    /**
     * 获取:指定账号的角色集合
     *
     * @param loginId 指定账号id
     * @return /
     */
    public static List<String> getRoleList(Object loginId) {
        return stpLogic.getRoleList(loginId);
    }

    /**
     * 判断:当前账号是否拥有指定角色, 返回 true 或 false
     *
     * @param role 角色
     * @return /
     */
    public static boolean hasRole(String role) {
        return stpLogic.hasRole(role);
    }

    /**
     * 判断:指定账号是否含有指定角色标识, 返回 true 或 false
     *
     * @param loginId 账号id
     * @param role 角色标识
     * @return 是否含有指定角色标识
     */
    public static boolean hasRole(Object loginId, String role) {
        return stpLogic.hasRole(loginId, role);
    }

    /**
     * 判断:当前账号是否含有指定角色标识 [ 指定多个,必须全部验证通过 ]
     *
     * @param roleArray 角色标识数组
     * @return true或false
     */
    public static boolean hasRoleAnd(String... roleArray){
        return stpLogic.hasRoleAnd(roleArray);
    }

    /**
     * 判断:当前账号是否含有指定角色标识 [ 指定多个,只要其一验证通过即可 ]
     *
     * @param roleArray 角色标识数组
     * @return true或false
     */
    public static boolean hasRoleOr(String... roleArray){
        return stpLogic.hasRoleOr(roleArray);
    }

    /**
     * 校验:当前账号是否含有指定角色标识, 如果验证未通过,则抛出异常: NotRoleException
     *
     * @param role 角色标识
     */
    public static void checkRole(String role) {
        stpLogic.checkRole(role);
    }

    /**
     * 校验:当前账号是否含有指定角色标识 [ 指定多个,必须全部验证通过 ]
     *
     * @param roleArray 角色标识数组
     */
    public static void checkRoleAnd(String... roleArray){
        stpLogic.checkRoleAnd(roleArray);
    }

    /**
     * 校验:当前账号是否含有指定角色标识 [ 指定多个,只要其一验证通过即可 ]
     *
     * @param roleArray 角色标识数组
     */
    public static void checkRoleOr(String... roleArray){
        stpLogic.checkRoleOr(roleArray);
    }


    // ------------------- 权限认证操作 -------------------

    /**
     * 获取:当前账号的权限码集合
     *
     * @return /
     */
    public static List<String> getPermissionList() {
        return stpLogic.getPermissionList();
    }

    /**
     * 获取:指定账号的权限码集合
     *
     * @param loginId 指定账号id
     * @return /
     */
    public static List<String> getPermissionList(Object loginId) {
        return stpLogic.getPermissionList(loginId);
    }

    /**
     * 判断:当前账号是否含有指定权限, 返回 true 或 false
     *
     * @param permission 权限码
     * @return 是否含有指定权限
     */
    public static boolean hasPermission(String permission) {
        return stpLogic.hasPermission(permission);
    }

    /**
     * 判断:指定账号 id 是否含有指定权限, 返回 true 或 false
     *
     * @param loginId 账号 id
     * @param permission 权限码
     * @return 是否含有指定权限
     */
    public static boolean hasPermission(Object loginId, String permission) {
        return stpLogic.hasPermission(loginId, permission);
    }

    /**
     * 判断:当前账号是否含有指定权限 [ 指定多个,必须全部具有 ]
     *
     * @param permissionArray 权限码数组
     * @return true 或 false
     */
    public static boolean hasPermissionAnd(String... permissionArray){
        return stpLogic.hasPermissionAnd(permissionArray);
    }

    /**
     * 判断:当前账号是否含有指定权限 [ 指定多个,只要其一验证通过即可 ]
     *
     * @param permissionArray 权限码数组
     * @return true 或 false
     */
    public static boolean hasPermissionOr(String... permissionArray){
        return stpLogic.hasPermissionOr(permissionArray);
    }

    /**
     * 校验:当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException
     *
     * @param permission 权限码
     */
    public static void checkPermission(String permission) {
        stpLogic.checkPermission(permission);
    }

    /**
     * 校验:当前账号是否含有指定权限 [ 指定多个,必须全部验证通过 ]
     *
     * @param permissionArray 权限码数组
     */
    public static void checkPermissionAnd(String... permissionArray) {
        stpLogic.checkPermissionAnd(permissionArray);
    }

    /**
     * 校验:当前账号是否含有指定权限 [ 指定多个,只要其一验证通过即可 ]
     *
     * @param permissionArray 权限码数组
     */
    public static void checkPermissionOr(String... permissionArray) {
        stpLogic.checkPermissionOr(permissionArray);
    }


    // ------------------- id 反查 token 相关操作 -------------------

    /**
     * 获取指定账号 id 的 token
     * <p>
     * 		在配置为允许并发登录时,此方法只会返回队列的最后一个 token,
     * 		如果你需要返回此账号 id 的所有 token,请调用 getTokenValueListByLoginId
     * </p>
     *
     * @param loginId 账号id
     * @return token值
     */
    public static String getTokenValueByLoginId(Object loginId) {
        return stpLogic.getTokenValueByLoginId(loginId);
    }

    /**
     * 获取指定账号 id 指定设备类型端的 token
     * <p>
     * 		在配置为允许并发登录时,此方法只会返回队列的最后一个 token,
     * 		如果你需要返回此账号 id 的所有 token,请调用 getTokenValueListByLoginId
     * </p>
     *
     * @param loginId 账号id
     * @param device 设备类型,填 null 代表不限设备类型
     * @return token值
     */
    public static String getTokenValueByLoginId(Object loginId, String device) {
        return stpLogic.getTokenValueByLoginId(loginId, device);
    }

    /**
     * 获取指定账号 id 的 token 集合
     *
     * @param loginId 账号id
     * @return 此 loginId 的所有相关 token
     */
    public static List<String> getTokenValueListByLoginId(Object loginId) {
        return stpLogic.getTokenValueListByLoginId(loginId);
    }

    /**
     * 获取指定账号 id 指定设备类型端的 token 集合
     *
     * @param loginId 账号id
     * @param device 设备类型,填 null 代表不限设备类型
     * @return 此 loginId 的所有登录 token
     */
    public static List<String> getTokenValueListByLoginId(Object loginId, String device) {
        return stpLogic.getTokenValueListByLoginId(loginId, device);
    }

    /**
     * 返回当前会话的登录设备类型
     *
     * @return 当前令牌的登录设备类型
     */
    public static String getLoginDevice() {
        return stpLogic.getLoginDevice();
    }


    // ------------------- 会话管理 -------------------

    /**
     * 根据条件查询缓存中所有的 token
     *
     * @param keyword 关键字
     * @param start 开始处索引
     * @param size 获取数量 (-1代表一直获取到末尾)
     * @param sortType 排序类型(true=正序,false=反序)
     *
     * @return token集合
     */
    public static List<String> searchTokenValue(String keyword, int start, int size, boolean sortType) {
        return stpLogic.searchTokenValue(keyword, start, size, sortType);
    }

    /**
     * 根据条件查询缓存中所有的 SessionId
     *
     * @param keyword 关键字
     * @param start 开始处索引
     * @param size 获取数量  (-1代表一直获取到末尾)
     * @param sortType 排序类型(true=正序,false=反序)
     *
     * @return sessionId集合
     */
    public static List<String> searchSessionId(String keyword, int start, int size, boolean sortType) {
        return stpLogic.searchSessionId(keyword, start, size, sortType);
    }

    /**
     * 根据条件查询缓存中所有的 Token-Session-Id
     *
     * @param keyword 关键字
     * @param start 开始处索引
     * @param size 获取数量 (-1代表一直获取到末尾)
     * @param sortType 排序类型(true=正序,false=反序)
     *
     * @return sessionId集合
     */
    public static List<String> searchTokenSessionId(String keyword, int start, int size, boolean sortType) {
        return stpLogic.searchTokenSessionId(keyword, start, size, sortType);
    }


    // ------------------- 账号封禁 -------------------

    /**
     * 封禁:指定账号
     * <p> 此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id)
     *
     * @param loginId 指定账号id
     * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
     */
    public static void disable(Object loginId, long time) {
        stpLogic.disable(loginId, time);
    }

    /**
     * 判断:指定账号是否已被封禁 (true=已被封禁, false=未被封禁)
     *
     * @param loginId 账号id
     * @return /
     */
    public static boolean isDisable(Object loginId) {
        return stpLogic.isDisable(loginId);
    }

    /**
     * 校验:指定账号是否已被封禁,如果被封禁则抛出异常
     *
     * @param loginId 账号id
     */
    public static void checkDisable(Object loginId) {
        stpLogic.checkDisable(loginId);
    }

    /**
     * 获取:指定账号剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
     *
     * @param loginId 账号id
     * @return /
     */
    public static long getDisableTime(Object loginId) {
        return stpLogic.getDisableTime(loginId);
    }

    /**
     * 解封:指定账号
     *
     * @param loginId 账号id
     */
    public static void untieDisable(Object loginId) {
        stpLogic.untieDisable(loginId);
    }


    // ------------------- 分类封禁 -------------------

    /**
     * 封禁:指定账号的指定服务
     * <p> 此方法不会直接将此账号id踢下线,如需封禁后立即掉线,请追加调用 StpUtil.logout(id)
     *
     * @param loginId 指定账号id
     * @param service 指定服务
     * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
     */
    public static void disable(Object loginId, String service, long time) {
        stpLogic.disable(loginId, service, time);
    }

    /**
     * 判断:指定账号的指定服务 是否已被封禁(true=已被封禁, false=未被封禁)
     *
     * @param loginId 账号id
     * @param service 指定服务
     * @return /
     */
    public static boolean isDisable(Object loginId, String service) {
        return stpLogic.isDisable(loginId, service);
    }

    /**
     * 校验:指定账号 指定服务 是否已被封禁,如果被封禁则抛出异常
     *
     * @param loginId 账号id
     * @param services 指定服务,可以指定多个
     */
    public static void checkDisable(Object loginId, String... services) {
        stpLogic.checkDisable(loginId, services);
    }

    /**
     * 获取:指定账号 指定服务 剩余封禁时间,单位:秒(-1=永久封禁,-2=未被封禁)
     *
     * @param loginId 账号id
     * @param service 指定服务
     * @return see note
     */
    public static long getDisableTime(Object loginId, String service) {
        return stpLogic.getDisableTime(loginId, service);
    }

    /**
     * 解封:指定账号、指定服务
     *
     * @param loginId 账号id
     * @param services 指定服务,可以指定多个
     */
    public static void untieDisable(Object loginId, String... services) {
        stpLogic.untieDisable(loginId, services);
    }


    // ------------------- 阶梯封禁 -------------------

    /**
     * 封禁:指定账号,并指定封禁等级
     *
     * @param loginId 指定账号id
     * @param level 指定封禁等级
     * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
     */
    public static void disableLevel(Object loginId, int level, long time) {
        stpLogic.disableLevel(loginId, level, time);
    }

    /**
     * 封禁:指定账号的指定服务,并指定封禁等级
     *
     * @param loginId 指定账号id
     * @param service 指定封禁服务
     * @param level 指定封禁等级
     * @param time 封禁时间, 单位: 秒 (-1=永久封禁)
     */
    public static void disableLevel(Object loginId, String service, int level, long time) {
        stpLogic.disableLevel(loginId, service, level, time);
    }

    /**
     * 判断:指定账号是否已被封禁到指定等级
     *
     * @param loginId 指定账号id
     * @param level 指定封禁等级
     * @return /
     */
    public static boolean isDisableLevel(Object loginId, int level) {
        return stpLogic.isDisableLevel(loginId, level);
    }

    /**
     * 判断:指定账号的指定服务,是否已被封禁到指定等级
     *
     * @param loginId 指定账号id
     * @param service 指定封禁服务
     * @param level 指定封禁等级
     * @return /
     */
    public static boolean isDisableLevel(Object loginId, String service, int level) {
        return stpLogic.isDisableLevel(loginId, service, level);
    }

    /**
     * 校验:指定账号是否已被封禁到指定等级(如果已经达到,则抛出异常)
     *
     * @param loginId 指定账号id
     * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常)
     */
    public static void checkDisableLevel(Object loginId, int level) {
        stpLogic.checkDisableLevel(loginId, level);
    }

    /**
     * 校验:指定账号的指定服务,是否已被封禁到指定等级(如果已经达到,则抛出异常)
     *
     * @param loginId 指定账号id
     * @param service 指定封禁服务
     * @param level 封禁等级 (只有 封禁等级 ≥ 此值 才会抛出异常)
     */
    public static void checkDisableLevel(Object loginId, String service, int level) {
        stpLogic.checkDisableLevel(loginId, service, level);
    }

    /**
     * 获取:指定账号被封禁的等级,如果未被封禁则返回-2
     *
     * @param loginId 指定账号id
     * @return /
     */
    public static int getDisableLevel(Object loginId) {
        return stpLogic.getDisableLevel(loginId);
    }

    /**
     * 获取:指定账号的 指定服务 被封禁的等级,如果未被封禁则返回-2
     *
     * @param loginId 指定账号id
     * @param service 指定封禁服务
     * @return /
     */
    public static int getDisableLevel(Object loginId, String service) {
        return stpLogic.getDisableLevel(loginId, service);
    }


    // ------------------- 临时身份切换 -------------------

    /**
     * 临时切换身份为指定账号id
     *
     * @param loginId 指定loginId
     */
    public static void switchTo(Object loginId) {
        stpLogic.switchTo(loginId);
    }

    /**
     * 结束临时切换身份
     */
    public static void endSwitch() {
        stpLogic.endSwitch();
    }

    /**
     * 判断当前请求是否正处于 [ 身份临时切换 ] 中
     *
     * @return /
     */
    public static boolean isSwitch() {
        return stpLogic.isSwitch();
    }

    /**
     * 在一个 lambda 代码段里,临时切换身份为指定账号id,lambda 结束后自动恢复
     *
     * @param loginId 指定账号id
     * @param function 要执行的方法
     */
    public static void switchTo(Object loginId, SaFunction function) {
        stpLogic.switchTo(loginId, function);
    }


    // ------------------- 二级认证 -------------------

    /**
     * 在当前会话 开启二级认证
     *
     * @param safeTime 维持时间 (单位: 秒)
     */
    public static void openSafe(long safeTime) {
        stpLogic.openSafe(safeTime);
    }

    /**
     * 在当前会话 开启二级认证
     *
     * @param service 业务标识
     * @param safeTime 维持时间 (单位: 秒)
     */
    public static void openSafe(String service, long safeTime) {
        stpLogic.openSafe(service, safeTime);
    }

    /**
     * 判断:当前会话是否处于二级认证时间内
     *
     * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时
     */
    public static boolean isSafe() {
        return stpLogic.isSafe();
    }

    /**
     * 判断:当前会话 是否处于指定业务的二级认证时间内
     *
     * @param service 业务标识
     * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时
     */
    public static boolean isSafe(String service) {
        return stpLogic.isSafe(service);
    }

    /**
     * 判断:指定 token 是否处于二级认证时间内
     *
     * @param tokenValue Token 值
     * @param service 业务标识
     * @return true=二级认证已通过, false=尚未进行二级认证或认证已超时
     */
    public static boolean isSafe(String tokenValue, String service) {
        return stpLogic.isSafe(tokenValue, service);
    }

    /**
     * 校验:当前会话是否已通过二级认证,如未通过则抛出异常
     */
    public static void checkSafe() {
        stpLogic.checkSafe();
    }

    /**
     * 校验:检查当前会话是否已通过指定业务的二级认证,如未通过则抛出异常
     *
     * @param service 业务标识
     */
    public static void checkSafe(String service) {
        stpLogic.checkSafe(service);
    }

    /**
     * 获取:当前会话的二级认证剩余有效时间(单位: 秒, 返回-2代表尚未通过二级认证)
     *
     * @return 剩余有效时间
     */
    public static long getSafeTime() {
        return stpLogic.getSafeTime();
    }

    /**
     * 获取:当前会话的二级认证剩余有效时间(单位: 秒, 返回-2代表尚未通过二级认证)
     *
     * @param service 业务标识
     * @return 剩余有效时间
     */
    public static long getSafeTime(String service) {
        return stpLogic.getSafeTime(service);
    }

    /**
     * 在当前会话 结束二级认证
     */
    public static void closeSafe() {
        stpLogic.closeSafe();
    }

    /**
     * 在当前会话 结束指定业务标识的二级认证
     *
     * @param service 业务标识
     */
    public static void closeSafe(String service) {
        stpLogic.closeSafe(service);
    }
}

6、自定义注解之管理员 SaAdminCheckLogin.java

/**
 * @Description sa-token验证令牌有效性
 * 登录认证(Admin版):只有登录之后才能进入该方法
 * <p> 可标注在函数、类上(效果等同于标注在此类的所有方法上)
 */
@SaCheckLogin(type = "admin")
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE})
public @interface SaAdminCheckLogin {
}

7、自定义注解之商家 SaMerchandiserCheckLogin.java

/**
 * @Description 验证商家令牌有效性
 * 登录认证(Merchandiser版):只有登录之后才能进入该方法
 * <p> 可标注在函数、类上(效果等同于标注在此类的所有方法上)
 */
@SaCheckLogin(type = "merchandiser")
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.TYPE})
public @interface SaMerchandiserCheckLogin {
}

三、总结

  本文主要是对上篇文章中的登录验证鉴权使用的Sa-Token框架进行了介绍,以及进行了简单的配置,在使用过程中出现了一些问题,例如有无请求头结果都一样,最后是因为application.yml文件没有配置完全等。最后,由于使用框架并不知道其中的具体实现,所以在出现问题时需要自己不断调试解决,希望能对你的学习和工作有所帮助!

 

 

 

 

 

  • 13
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue-simple-uploader是一个轻量级的vue文件上传组件,可以支持多文件上传以及上传进度和错误信息提示。 要使用vue-simple-uploader实现文件夹上传,需要先将文件夹打包为zip文件,然后使用vue-simple-uploader上传zip文件即可。 以下是实现步骤: 1.安装vue-simple-uploader ``` npm install vue-simple-uploader --save ``` 2.在Vue组件中引入Vue-simple-uploader ``` import Uploader from 'vue-simple-uploader' export default { components: { Uploader } } ``` 3.在Vue组件中使用Vue-simple-uploader ``` <template> <div> <uploader ref="uploader" :upload-url="uploadUrl" :headers="headers" :data="formData" :multiple="false" :extensions="extensions" :auto-upload="false" @file-added="onFileAdded" @file-removed="onFileRemoved" @uploading="onUploading" @upload-success="onUploadSuccess" @upload-error="onUploadError" @upload-complete="onUploadComplete" /> <button @click="uploadFolder">上传文件夹</button> </div> </template> ``` 4.在Vue组件中实现上传文件夹的方法 ``` methods: { uploadFolder() { // 将文件夹打包为zip文件 let zip = new JSZip() let folder = zip.folder('folder') // 添加文件夹中的文件 folder.file('file1.txt', 'content1') folder.file('file2.txt', 'content2') // 生成zip文件 zip.generateAsync({ type: 'blob' }).then((blob) => { // 将zip文件上传 let file = new File([blob], 'folder.zip') this.$refs.uploader.add([file]) this.$refs.uploader.upload() }) }, onUploadSuccess(response, file, fileList) { // 上传成功回调函数 console.log(response) }, onUploadError(error, file, fileList) { // 上传失败回调函数 console.log(error) } } ``` 上述代码中,使用JSZip将文件夹打包为zip文件,然后将zip文件添加到vue-simple-uploader中,最后调用upload方法上传文件。上传成功或失败后,会分别调用onUploadSuccess和onUploadError回调函数。 需要注意的是,由于JSZip依赖于浏览器的原生Zip API,因此在一些不支持Zip API的浏览器上可能无法使用

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值