每个用户最多用户会话 - apache shiro

时间:2016-06-15 04:52:12

标签: java login shiro

我已经配置了 Apache shiro ,它可以正常使用我的应用程序。

现在我需要为每个用户配置最大会话数,这意味着一个用户无法登录到另一台计算机,或者如果他尝试登录,它应该使之前的会话无效,或者他无法使用新会话登录。

在单个时间点,应该只有一个用户会话。

LoginServlet

UsernamePasswordToken token = new UsernamePasswordToken(username , password);
org.apache.shiro.subject.Subject subject = SecurityUtils.getSubject();
subject.login(token);
loginSuccessful = true;
token.clear();

配置xml

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager" />
    </bean>

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="cacheManager" ref="shiroCacheManager" />
        <property name="realm" ref="myRealm" />
    </bean>

    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />

    <bean id="shiroCacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
    </bean>

    <bean id="myRealm" class="com.mypackage.service.shiro.RoleSecurityJdbcRealm">
        <property name="dataSource" ref="shiroDatasource" />
        <property name="permissionsLookupEnabled" value="true"></property>
    </bean>

1 个答案:

答案 0 :(得分:0)

如果您为此用户找到另一个活动会话,则需要从Class ModularRealmAuthenticator实现doAuthenticate(AuthenticationToken authenticationToken)并抛出ConcurrentAccessException。

可以从

获取所有活动会话

Collection activeSessions =((DefaultSessionManager)SecurityUtils.getSecurityManager())。getActiveSessions()