记录shiro的异地登录

转载 https://www.cnblogs.com/zeussbook/p/10882426.html

 

/**
  * 登录认证
  * @param token
  * @return
  * @throws AuthenticationException
  */
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    //获取用户的输入的账号.
    String username = (String)token.getPrincipal();
    //通过username从数据库中查找 User对象,如果找到,没找到.
    //实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法
    LoginUser userInfo = loginUserBiz.getByName(username);
    if(null==userInfo){
        return null;
    }
    //2.处理一个账号异地登录的问题,后期用户量上来需要做优化,比如登录用cas
    DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager();
    DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)securityManager.getSessionManager();
    //获取当前已登录的用户session列表
    Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions();
    for(Session session:sessions){
        //查找是否有当前登录账户的记录,有就清除该用户以前登录时保存的session
        Object obj = session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
        if(null!=obj){
            if(obj instanceof SimplePrincipalCollection){
                //强转
                SimplePrincipalCollection spc = (SimplePrincipalCollection)obj;
                LoginUser user = new LoginUser();
                BeanUtils.copyProperties(spc.getPrimaryPrincipal(),user);
                //判断用户,匹配用户ID。
                if(userInfo.getId().equals(user.getId())){
                    sessionManager.getSessionDAO().delete(session);
                }
            }
        }
    }
    //创建认证
    SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
            userInfo, //用户信息
             userInfo.getPassword(), //密码
            ByteSource.Util.bytes(userInfo.getSalt()),//passsword=MD5(pass+salt)
            getName()  //realm name
    );
    return authenticationInfo;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值