sa-token 多端登录思路和遇到的坑

sa-token 多端登录思路和遇到的坑,第1张

sa-token 多端登录思路和遇到的坑

简单介绍一下sa-token

一个轻量级 Java 权限认证框架,让鉴权变得简单、优雅!

就是因为这句话,越来越多的小伙伴们开始使用sa-token,当然我也不例外,这篇文章就我在使用中遇到的问题,还有一些设计思路做一个简单的总结。也是记录一下免得以后自己忘掉了,下面进入正题。

首先简单描述一下需求,在不使用SSO以及Oauth2.0的情况下,实现IOS,安卓,WEB,PC多端登录,并且登录后有时效(有效期),在有效期内如果有一小时(或者任意时间段) 内用户未进行 *** 作,需要把当前用户登出(当前用户所在的设备端登出,其他端不登出),而且每个设备端的登出时间段不相同(栗子:ios和安卓的有效期是30天,不需要校验多久未 *** 作登出,web有效期为一天,但是一个小时未 *** 作就要被登出),这个就是我当时要做的需求,希望说的比较明白了。

说一下思路,首先看一下sa-token有没有我需要的api,在登录的时候,可以通过定义SaLoginModel 来配置当前登录人的设备端以及token的超时时间,但是对于临时有效期的配置,这里是没有的。

StpUserUtil.login(user.getUserId(),new SaLoginModel()
                   .setDevice(clientType).setTimeout(timeOut));

所以我是怎么解决的呢? 当翻阅了源码过后发现sa-token的临时有效期是通过getConfig()方法每次从配置文件中获取的,这下思路就打开了。

在官方文档中提到了自定义的StpUtil也就是StpUserUtil,在文档中展示如下

public class StpUserUtil {

    // 使用匿名子类 重写`stpLogic对象`的一些方法 
    public static StpLogic stpLogic = new StpLogic("user") {
        // 重写 StpLogic 类下的 `splicingKeyTokenName` 函数,返回一个与 `StpUtil` 不同的token名称, 防止冲突 
        @Override
        public String splicingKeyTokenName() {
            return super.splicingKeyTokenName() + "-user";
        }
        // 同理你可以按需重写一些其它方法 ... 
    }; 
}

既然可以重写StpLogic类 ,前面提到的getConfig方法就在StpLogic类中,那么我们就可以重写getConfig方法如下

 // APP 端 Config
    static SaTokenConfig configAPP = new SaTokenConfig() {{
        setActivityTimeout(-1);
       //..
    }};

    // PC 端Config
    static SaTokenConfig configPC = new SaTokenConfig() {{
         setActivityTimeout(60 * 60);
       //..
    }};

    // 使用匿名子类 重写`stpLogic对象`的一些方法
    public static StpLogic stpLogic = new StpLogic(TYPE) {
        @Override
        public SaTokenConfig getConfig() {
            try {
                String device = SaManager.getSaTokenDao().get("****");
                if(SaTokenConf.WEB.equals(device)) {
                    return configPC;
                }else if(token != null && !token.equals("null") && device != null){
                    return configAPP;
                }
            }catch (Exception e){

            }
            return SaManager.getConfig();
        }

        @Override
        public boolean hasPermission(String permission) {
            return super.hasPermission(permission);
        }
    };

在登陆时将登入人的设备类型存入到你想存的地方,我这里是存入的redis中,通过SaManager.getSaTokenDao()获取到sa-token的redis实现从而实现存储,在获取到device后,进行判断,最终拿到对应的Config,这样就可以实现在不同的设备端,拥有不同的token临时有效期。

这个方法也只是为了实现功能而写,并没有那么优雅的解决这个问题,希望看到此文章的各位同僚们,能提出你们的建议和意见。

原创文章不易,给个关注吧,谢谢。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5719840.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存