Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

添加 StpUtil.getLoginInfo() 和 StpUtil.getLoginInfo(Object loginId) 来获取登录信息 #647

Open
wants to merge 2 commits into
base: dev
Choose a base branch
from

Conversation

suzhelan
Copy link

我在进行业务开发的时候 想传入 Android-Readmi K50 来进行多设备管理区分 让前端可以做到类似
查看->已经登录的设备列表->踢某台手机下线

    StpUtil.login(uin, new SaLoginModel()
                .setDevice("Android-Readmi K50")
                .setIsWriteHeader(false)
                .setIsLastingCookie(true));

但我发现satoken并有提供类似能获得所有登录信息并返回为List的函数 saSession.getTokenSignList() 但不太符合我的预期

我做出变更具体变更如下
StpUtil

    // ------------------- 获取 登录信息 相关 -------------------
    /**
     * 获取当前账号id登录信息
     * <p>
     * 使用场景 在调用 {@link StpUtil#login(Object, String)} 时 倘如传参为login,Android-XiaoMi 14
     * 那么可以使用此方法来批量获取设备登录信息 来给前端进行设备token管理
     *
     * @return 当前账号登录信息列表
     */
    public static List<SaLoginInfo> getLoginInfoList() {
        return stpLogic.getLoginInfoList();
    }

    /**
     * 获取指定账号id的登录信息
     *
     * @param loginId 指定账号id
     * @return 指定账号的登录信息列表
     */
    public static List<SaLoginInfo> getLoginInfoList(Object loginId) {
        return stpLogic.getLoginInfoList(loginId);
    }

StpLogic

    // ------------------- 获取 登录信息 相关 -------------------

    /**
     * 获取当前账号的所有登录信息
     *
     * @return 当前账号登录信息列表
     */
    public List<SaLoginInfo> getLoginInfoList() {
        return getLoginInfoList(getLoginId());
    }

    /**
     * 获取当前登录的信息列表
     *
     * @param loginId 账号id
     * @return p1的账号登录信息列表
     */
    public List<SaLoginInfo> getLoginInfoList(Object loginId) {
        ArrayList<SaLoginInfo> loginInfoList = new ArrayList<>();
        //获取session
        SaSession session = this.getSessionByLoginId(loginId,false);
        if (session == null) {
            return loginInfoList;
        }
        //获取该账号的session token sign列表
        List<TokenSign> tokenSignList = session.getTokenSignList();
        for (TokenSign tokenSign : tokenSignList) {
            String token = tokenSign.getValue();
            SaLoginInfo loginInfo = new SaLoginInfo();
            //token key(request Header key)
            loginInfo.setTokenName(getTokenName());
            //token
            loginInfo.setTokenValue(token);
            //账号id
            loginInfo.setLoginId(loginId);
            //登录设备
            loginInfo.setLoginDevice(getLoginDeviceByToken(token));
            //token有效期
            loginInfo.setTokenTimeout(getTokenTimeout(token));
            //session有效期
            loginInfo.setSessionTimeout(getSessionTimeoutByLoginId(loginId));
            //token的session有效期
            loginInfo.setTokenSessionTimeout(getTokenSessionTimeoutByTokenValue(token));
            //剩余token的活跃时间 完了会被冻结
            loginInfo.setTokenActiveTimeout(getTokenActiveTimeoutByToken(token));
            //加入到返回结果当中
            loginInfoList.add(loginInfo);
        }
        return loginInfoList;
    }

add new class SaLoginInfo

package cn.dev33.satoken.stp;

/**
 * 登录信息 model
 *
 *<P>
 *  {
 *   "tokenName": "satoekn", //request Header Name
 *   "tokenValue": "eef25f7b6c6048d093fc4427aa62f36c", //token
 *   "loginId": 10002, //login id
 *   "tokenTimeout": -1, //token 剩余有效期(单位: 秒)
 *   "sessionTimeout": -1, //Session 剩余有效时间(单位: 秒)
 *   "tokenSessionTimeout": -1, //Token-Session 剩余有效时间(单位: 秒)
 *   "tokenActiveTimeout": -1, //token 距离被冻结还剩多少时间(单位: 秒)
 *   "loginDevice": "Android-Readmi K50" //登录设备
 * }
 *</P>
 *
 * @author suzhelan
 * @version 1.0
 */
public class SaLoginInfo {
    /**
     * token name
     */
    private String tokenName;

    /**
     * token
     */
    private String tokenValue;

    /**
     * 此 token 对应的 LoginId
     */
    private Object loginId;

    /**
     * token 剩余有效期(单位: 秒)
     */
    private long tokenTimeout;

    /**
     * Account-Session 剩余有效时间(单位: 秒)
     */
    private long sessionTimeout;

    /**
     * Token-Session 剩余有效时间(单位: 秒)
     */
    private long tokenSessionTimeout;

    /**
     * token 距离被冻结还剩多少时间(单位: 秒)
     */
    private long tokenActiveTimeout;

    /**
     * 登录设备类型
     */
    private String loginDevice;

    public String getTokenName() {
        return tokenName;
    }

    public void setTokenName(String tokenName) {
        this.tokenName = tokenName;
    }

    public String getTokenValue() {
        return tokenValue;
    }

    public void setTokenValue(String tokenValue) {
        this.tokenValue = tokenValue;
    }

    public Object getLoginId() {
        return loginId;
    }

    public void setLoginId(Object loginId) {
        this.loginId = loginId;
    }

    public long getTokenTimeout() {
        return tokenTimeout;
    }

    public void setTokenTimeout(long tokenTimeout) {
        this.tokenTimeout = tokenTimeout;
    }

    public long getSessionTimeout() {
        return sessionTimeout;
    }

    public void setSessionTimeout(long sessionTimeout) {
        this.sessionTimeout = sessionTimeout;
    }

    public long getTokenSessionTimeout() {
        return tokenSessionTimeout;
    }

    public void setTokenSessionTimeout(long tokenSessionTimeout) {
        this.tokenSessionTimeout = tokenSessionTimeout;
    }

    public long getTokenActiveTimeout() {
        return tokenActiveTimeout;
    }

    public void setTokenActiveTimeout(long tokenActiveTimeout) {
        this.tokenActiveTimeout = tokenActiveTimeout;
    }

    public String getLoginDevice() {
        return loginDevice;
    }

    public void setLoginDevice(String loginDevice) {
        this.loginDevice = loginDevice;
    }
}

仅做出了微小的贡献 如遇冲突,测试失败,不符合项目规划请拒绝此pr

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant