小编在使用shiro+redis做权限控制的过程中遇到了同一账号在不同的客户端登录,结果是都能登录的问题,于是猜想怎么实现同一用户第二次登录的时候怎么剔除第一次登录的记录,于是查询相关资料解决了此问题。主要是在自定义realm 的认证方法内添加如下代码:
//同一用户只能从一个客户端登录
DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager)SecurityUtils.getSecurityManager();
DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)securityManager.getSessionManager();
SessionDAO sessionDAO = sessionManager.getSessionDAO();
Collection<Session> activeSessions = sessionDAO.getActiveSessions();
if(activeSessions != null && activeSessions.size() > 0){
for (Session session : activeSessions) {
SimplePrincipalCollection attribute = (SimplePrincipalCollection)session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
if(attribute !=null){
Collection<User> users = attribute.byType(User.class);
User next = users.iterator().next();
String sessionusername = next.getUsername();
if(username.equals(sessionusername)){
sessionDAO.delete(session);
}
}
}
}
如有不懂之处请留言,小编会知无不言言无不尽。