栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

sa-token——权限认证《二》

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

sa-token——权限认证《二》

sa-token——权限认证《二》

会话治理全局侦听器全局过滤器多账号认证redis业务数据和权限数据分离开
sa-token官网文档

会话治理
// 查询所有token
StpUtil.searchTokenValue(String keyword, int start, int size);
// 查询所有账号Session会话
StpUtil.searchSessionId(String keyword, int start, int size);
// 查询所有令牌Session会话
StpUtil.searchTokenSessionId(String keyword, int start, int size);

keyword: 查询关键字,只有包括这个字符串的token值才会被查询出来
start: 数据开始处索引, 值为-1时代表一次性取出所有数据
size: 要获取的数据条数

// 查询value包括1000的所有token,结果集从第0条开始,返回10条
List tokenList = StpUtil.searchTokenValue("1000", 0, 10);    
for (String token : tokenList) {
    System.out.println(token);
}

注意事项:
由于会话查询底层采用了遍历方式获取数据,当数据量过大时此操作将会比较耗时
单机模式下:百万会话取出10条token平均耗时 0.255s
Redis模式下:百万会话取出10条token平均耗时 3.322s
请根据业务实际水平合理调用API
(实施获取用WebSocket)

全局侦听器

接口SaTokenListener是Sa-Token的全局侦听器,通过实现此接口,你可以在用户登陆、退出、被踢下线等关键性操作时进行一些AOP操作
框架对此侦听器的默认实现是log日志输出,你可以通过配置sa-token.is-log=true开启

可以写自己的业务逻辑,日志记录等
效果图:


@Component
public class MySaTokenListener implements SaTokenListener {
    
    @Override
    public void doLogin(String loginType, Object loginId, SaLoginModel loginModel) {
        System.out.println("登录了----------");
        // ...
    }
    
    @Override
    public void doLogout(String loginType, Object loginId, String tokenValue) {
        System.out.println("注销了----------");
        // ...
    }
    
    @Override
    public void doKickout(String loginType, Object loginId, String tokenValue) {
        System.out.println("踢下线了----------");
        // ...
    }
    
    @Override
    public void doReplaced(String loginType, Object loginId, String tokenValue) {
        System.out.println("顶下线了----------");
        // ...
    }
    
    @Override
    public void doDisable(String loginType, Object loginId, long disableTime) {
        System.out.println("封号了----------");
        // ...
    }
    
    @Override
    public void doUntieDisable(String loginType, Object loginId) {
        System.out.println("解封了----------");
        // ...
    }
    
    @Override
    public void doCreateSession(String id) {
        System.out.println("创建session了----------");
        // ...
    }
    
    @Override
    public void doLogoutSession(String id) {
        System.out.println("注销session了----------");
        // ...
    }
}
全局过滤器 多账号认证

定义一个自己的登录工具类:重写里面的方法StpUtil,改变类型即可
再使用上,用StpUserUtil.*,有的加类型

package com.shanghai.test1114.utils;
import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.fun.SaFunction;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;

import java.util.List;



public class StpUserUtil {
    
    public static final String TYPE = "user";

    
    public static StpLogic stpLogic = new StpLogic(TYPE);

    
    public static String getLoginType(){
        return stpLogic.getLoginType();
    }

    
    public static void setStpLogic(StpLogic stpLogic) {
        StpUtil.stpLogic = stpLogic;
        // 防止自定义 stpLogic 被覆盖
        SaManager.putStpLogic(stpLogic);
    }


    // =================== 获取token 相关 ===================

    
    public static String getTokenName() {
        return stpLogic.getTokenName();
    }

    
    public static void setTokenValue(String tokenValue){
        stpLogic.setTokenValue(tokenValue);
    }

    
    public static void setTokenValue(String tokenValue, int cookieTimeout){
        stpLogic.setTokenValue(tokenValue, cookieTimeout);
    }

    
    public static String getTokenValue() {
        return stpLogic.getTokenValue();
    }

    
    public static String getTokenValueNotCut(){
        return stpLogic.getTokenValueNotCut();
    }

    
    public static SaTokenInfo getTokenInfo() {
        return stpLogic.getTokenInfo();
    }


    // =================== 登录相关操作 ===================

    // --- 登录

    
    public static void login(Object id) {
        stpLogic.login(id);
    }

    
    public static void login(Object id, String device) {
        stpLogic.login(id, device);
    }

    
    public static void login(Object id, boolean isLastingcookie) {
        stpLogic.login(id, isLastingcookie);
    }

    
    public static void login(Object id, SaLoginModel loginModel) {
        stpLogic.login(id, loginModel);
    }

    // --- 注销

    
    public static void logout() {
        stpLogic.logout();
    }

    
    public static void logout(Object loginId) {
        stpLogic.logout(loginId);
    }

    
    public static void logout(Object loginId, String device) {
        stpLogic.logout(loginId, device);
    }

    
    public static void logoutByTokenValue(String tokenValue) {
        stpLogic.logoutByTokenValue(tokenValue);
    }

    
    public static void kickout(Object loginId) {
        stpLogic.kickout(loginId);
    }

    
    public static void kickout(Object loginId, String device) {
        stpLogic.kickout(loginId, device);
    }

    
    public static void kickoutByTokenValue(String tokenValue) {
        stpLogic.kickoutByTokenValue(tokenValue);
    }

    
    public static void replaced(Object loginId, String device) {
        stpLogic.replaced(loginId, device);
    }


    // 查询相关

    
    public static boolean isLogin() {
        return stpLogic.isLogin();
    }

    
    public static void checkLogin() {
        stpLogic.checkLogin();
    }

    
    public static Object getLoginId() {
        return stpLogic.getLoginId();
    }

    
    public static  T getLoginId(T defaultValue) {
        return stpLogic.getLoginId(defaultValue);
    }

    
    public static Object getLoginIdDefaultNull() {
        return stpLogic.getLoginIdDefaultNull();
    }

    
    public static String getLoginIdAsString() {
        return stpLogic.getLoginIdAsString();
    }

    
    public static int getLoginIdAsInt() {
        return stpLogic.getLoginIdAsInt();
    }

    
    public static long getLoginIdAsLong() {
        return stpLogic.getLoginIdAsLong();
    }

    
    public static Object getLoginIdByToken(String tokenValue) {
        return stpLogic.getLoginIdByToken(tokenValue);
    }


    // =================== User-Session 相关 ===================

    
    public static SaSession getSessionByLoginId(Object loginId, boolean isCreate) {
        return stpLogic.getSessionByLoginId(loginId, isCreate);
    }

    
    public static SaSession getSessionBySessionId(String sessionId) {
        return stpLogic.getSessionBySessionId(sessionId);
    }

    
    public static SaSession getSessionByLoginId(Object loginId) {
        return stpLogic.getSessionByLoginId(loginId);
    }

    
    public static SaSession getSession(boolean isCreate) {
        return stpLogic.getSession(isCreate);
    }

    
    public static SaSession getSession() {
        return stpLogic.getSession();
    }


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

    
    public static SaSession getTokenSessionByToken(String tokenValue) {
        return stpLogic.getTokenSessionByToken(tokenValue);
    }

    
    public static SaSession getTokenSession() {
        return stpLogic.getTokenSession();
    }


    // =================== [临时有效期] 验证相关 ===================

    
    public static void checkActivityTimeout() {
        stpLogic.checkActivityTimeout();
    }

    
    public static void updateLastActivityToNow() {
        stpLogic.updateLastActivityToNow();
    }


    // =================== 过期时间相关 ===================

    
    public static long getTokenTimeout() {
        return stpLogic.getTokenTimeout();
    }

    
    public static long getSessionTimeout() {
        return stpLogic.getSessionTimeout();
    }

    
    public static long getTokenSessionTimeout() {
        return stpLogic.getTokenSessionTimeout();
    }

    
    public static long getTokenActivityTimeout() {
        return stpLogic.getTokenActivityTimeout();
    }



    // =================== 角色验证操作 ===================

    
    public static List getRoleList() {
        return stpLogic.getRoleList();
    }

    
    public static List getRoleList(Object loginId) {
        return stpLogic.getRoleList(loginId);
    }

    
    public static boolean hasRole(String role) {
        return stpLogic.hasRole(role);
    }

    
    public static boolean hasRole(Object loginId, String role) {
        return stpLogic.hasRole(loginId, role);
    }

    
    public static boolean hasRoleAnd(String... roleArray){
        return stpLogic.hasRoleAnd(roleArray);
    }

    
    public static boolean hasRoleOr(String... roleArray){
        return stpLogic.hasRoleOr(roleArray);
    }

    
    public static void checkRole(String role) {
        stpLogic.checkRole(role);
    }

    
    public static void checkRoleAnd(String... roleArray){
        stpLogic.checkRoleAnd(roleArray);
    }

    
    public static void checkRoleOr(String... roleArray){
        stpLogic.checkRoleOr(roleArray);
    }


    // =================== 权限验证操作 ===================

    
    public static List getPermissionList() {
        return stpLogic.getPermissionList();
    }

    
    public static List getPermissionList(Object loginId) {
        return stpLogic.getPermissionList(loginId);
    }

    
    public static boolean hasPermission(String permission) {
        return stpLogic.hasPermission(permission);
    }

    
    public static boolean hasPermission(Object loginId, String permission) {
        return stpLogic.hasPermission(loginId, permission);
    }

    
    public static boolean hasPermissionAnd(String... permissionArray){
        return stpLogic.hasPermissionAnd(permissionArray);
    }

    
    public static boolean hasPermissionOr(String... permissionArray){
        return stpLogic.hasPermissionOr(permissionArray);
    }

    
    public static void checkPermission(String permission) {
        stpLogic.checkPermission(permission);
    }

    
    public static void checkPermissionAnd(String... permissionArray) {
        stpLogic.checkPermissionAnd(permissionArray);
    }

    
    public static void checkPermissionOr(String... permissionArray) {
        stpLogic.checkPermissionOr(permissionArray);
    }


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

    
    public static String getTokenValueByLoginId(Object loginId) {
        return stpLogic.getTokenValueByLoginId(loginId);
    }

    
    public static String getTokenValueByLoginId(Object loginId, String device) {
        return stpLogic.getTokenValueByLoginId(loginId, device);
    }

    
    public static List getTokenValueListByLoginId(Object loginId) {
        return stpLogic.getTokenValueListByLoginId(loginId);
    }

    
    public static List getTokenValueListByLoginId(Object loginId, String device) {
        return stpLogic.getTokenValueListByLoginId(loginId, device);
    }

    
    public static String getLoginDevice() {
        return stpLogic.getLoginDevice();
    }


    // =================== 会话管理 ===================

    
    public static List searchTokenValue(String keyword, int start, int size) {
        return stpLogic.searchTokenValue(keyword, start, size);
    }

    
    public static List searchSessionId(String keyword, int start, int size) {
        return stpLogic.searchSessionId(keyword, start, size);
    }

    
    public static List searchTokenSessionId(String keyword, int start, int size) {
        return stpLogic.searchTokenSessionId(keyword, start, size);
    }


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

    
    public static void disable(Object loginId, long disableTime) {
        stpLogic.disable(loginId, disableTime);
    }

    
    public static boolean isDisable(Object loginId) {
        return stpLogic.isDisable(loginId);
    }

    
    public static long getDisableTime(Object loginId) {
        return stpLogic.getDisableTime(loginId);
    }

    
    public static void untieDisable(Object loginId) {
        stpLogic.untieDisable(loginId);
    }


    // =================== 身份切换 ===================

    
    public static void switchTo(Object loginId) {
        stpLogic.switchTo(loginId);
    }

    
    public static void endSwitch() {
        stpLogic.endSwitch();
    }

    
    public static boolean isSwitch() {
        return stpLogic.isSwitch();
    }

    
    public static void switchTo(Object loginId, SaFunction function) {
        stpLogic.switchTo(loginId, function);
    }


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

    
    public static void openSafe(long safeTime) {
        stpLogic.openSafe(safeTime);
    }

    
    public static boolean isSafe() {
        return stpLogic.isSafe();
    }

    
    public static void checkSafe() {
        stpLogic.checkSafe();
    }

    
    public static long getSafeTime() {
        return stpLogic.getSafeTime();
    }

    
    public static void closeSafe() {
        stpLogic.closeSafe();
    }


    // =================== 历史API,兼容旧版本 ===================

    
    @Deprecated
    public static String getLoginKey(){
        return stpLogic.getLoginType();
    }

    
    @Deprecated
    public static void setLoginId(Object loginId) {
        stpLogic.login(loginId);
    }

    
    @Deprecated
    public static void setLoginId(Object loginId, String device) {
        stpLogic.login(loginId, device);
    }

    
    @Deprecated
    public static void setLoginId(Object loginId, boolean isLastingcookie) {
        stpLogic.login(loginId, isLastingcookie);
    }

    
    @Deprecated
    public static void setLoginId(Object loginId, SaLoginModel loginModel) {
        stpLogic.login(loginId, loginModel);
    }

    
    @Deprecated
    public static void logoutByLoginId(Object loginId) {
        stpLogic.kickout(loginId);
    }

    
    @Deprecated
    public static void logoutByLoginId(Object loginId, String device) {
        stpLogic.kickout(loginId, device);
    }

}

redis业务数据和权限数据分离开


依赖



    cn.dev33
    sa-token-alone-redis
    1.28.0

配置文件

sa-token:
  alone-redis:
    database: 2
    host: 127.0.0.1
    port: 6379
    password:
    timeout: 10

测试代码

    // 测试Sa-Token缓存
    @GetMapping("/testRedisAlone/login")
    @ApiOperation("Token缓存")
    public AjaxJson login(@RequestParam(defaultValue = "10001") String id) {
        System.out.println("--------------- 测试Sa-Token缓存");
        StpUtil.login(id);
        return AjaxJson.getSuccess();
    }
    // 测试业务缓存
    @GetMapping("/testRedisAlone/test")
    @ApiOperation("测试业务缓存")
    public AjaxJson test() {
        System.out.println("--------------- 测试业务缓存");
        stringRedisTemplate.opsForValue().set("hello", "Hello World");
        return AjaxJson.getSuccess();
    }

sa-token官网文档

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/721388.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号