如何检查用户已经使用Apache Shirologin?

这个问题很简单。 我想限制来自不同机器/浏览器的相同login的用户访问:只有一个活用户会话是可能的。

Apache shiro库用于用户authentication和pipe理。

当然,这可以使用简单的synchornized地图等,但问题是:具有Apache Shiro特殊机制呢?

这个问题的另一个变种:如何尊重使用apache shirologin系统的所有主题列表?

UPD:

澄清我的问题。 我的愿望是有这样的代码(我知道,没有这样的类例外,但想法必须更清洁):

 Subject currentUser = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken(login, password); try { currentUser.login(token); } catch (AlreadyAuthenticatedException aae) { errorMsg = "You should logoff on another machine!"; } 

Session会话存储在SessionDAO并以sessionId作为密钥。 没有额外的努力,您不能通过委托人(用户名)访问会话。 但是,您可以扩展DefaultSecurityManager并通过SessionDAO.getActiveSessions检查所有活动的会话。 下面的代码可能是一个简单的例子(假设你没有使用WebSubject ):

 public class UniquePrincipalSecurityManager extends org.apache.shiro.mgt.DefaultSecurityManager { @Override public Subject login(Subject subject, AuthenticationToken token) throws AuthenticationException { String loginPrincipal = (String) token.getPrincipal(); DefaultSessionManager sm = (DefaultSessionManager) getSessionManager(); for (Session session : sm.getSessionDAO().getActiveSessions()) { SimplePrincipalCollection p = (SimplePrincipalCollection) session .getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); if (p != null && loginPrincipal.equals(p.getPrimaryPrincipal())) { throw new AlreadyAuthenticatedException(); } } return super.login(subject, token); } }