每个用户的最大用户会话数 - apache shiro

Posted

技术标签:

【中文标题】每个用户的最大用户会话数 - apache shiro【英文标题】:Max user sessions per user - apache shiro 【发布时间】:2016-10-16 00:51:39 【问题描述】:

我已经配置了 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】:

你需要从类 ModularRealmAuthenticator 中实现 doAuthenticate(AuthenticationToken authenticationToken) 并在你找到该用户的另一个活动会话时抛出 ConcurrentAccessException。

所有活动的会话都可以从

获取

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

【讨论】:

我会按照你的建议尝试 getActiveSessions() DefaultSessionManager 内部受到保护,该怎么办?? 我正在使用DefaultWebSecurityManager 扩展 DefaultSessionManager 并将其公开 :) 并将其设置为 shiro.ini 中的会话管理器或在加载期间调用 SecurityManager.setSessionManager。 我添加了有问题的配置 xml,我正在使用 DefaultWebSecurityManager ,然后配置我的 realm

以上是关于每个用户的最大用户会话数 - apache shiro的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 每小时最大并发用户会话数

oracle 如何限定用户并发会话数

PHP Apache 增加每个客户端的最大并发连接数

windows server 2008远程桌面最大连接数设置

最大并发连接数和最大会话数的区别

Grails Spring Security 最大并发会话