shiro 实现单用户登录,一个用户同一时刻只能在一个地方登录

我这里 shiro 并没有集成 springMVC,直接使用 ini 配置文件。

shiro.ini

[main]
# Objects and their properties are defined here,
# Such as the securityManager, Realms and anything
# else needed to build the SecurityManager
authc.loginUrl = /login.jsp
authc.successUrl = /web/index.jsp

#cache manager
builtInCacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager
securityManager=org.apache.shiro.web.mgt.DefaultWebSecurityManager
securityManager.cacheManager = $builtInCacheManager
securityManager.sessionManager=$sessionManager

#session 必须配置session,强制退出时,通过将session移除实现
sessionManager=org.apache.shiro.web.session.mgt.DefaultWebSessionManager
sessionManager.sessionDAO=$sessionDAO

sessionDAO=org.apache.shiro.session.mgt.eis.MemorySessionDAO

# Create ldap realm
ldapRealm = org.apache.shiro.realm.ldap.JndiLdapRealm
#......

# Configure JDBC realm datasource
dataSource = org.postgresql.ds.PGPoolingDataSource
#.......

# Create JDBC realm.
jdbcRealm.permissionsLookupEnabled = true
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.userRolesQuery = ......
jdbcRealm.permissionsQuery = ......
jdbcRealm.dataSource = $dataSource

#self realm
localAuthorizingRealm = com.redbudtek.shiro.LocalAuthorizingRealm

securityManager.realms = $ldapRealm, $localAuthorizingRealm

在 LocalAuthorizingRealm 中,用户登录进行认证之前,先将该用户的其他session移除:

@Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        String userName = (String)authenticationToken.getPrincipal();

        //处理session
        DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager();
        DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)securityManager.getSessionManager();
        Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions();//获取当前已登录的用户session列表
        for(Session session:sessions){
            //清除该用户以前登录时保存的session
            if(userName.equals(String.valueOf(session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY)))) {
                sessionManager.getSessionDAO().delete(session);
            }
        }

        String pwd = null;
        return new SimpleAuthenticationInfo(userName,pwd,getName());
    }

当session删除之后,必须有客户端与服务器端的交互,shiro才能进行认证判断。在与服务器交互时,subject信息截图如下:

此时的登录的用户认证已经失效,可以对客户端做出响应。

时间: 2024-10-31 10:31:35

shiro 实现单用户登录,一个用户同一时刻只能在一个地方登录的相关文章

Asp.net 实现只能允许一个账号同时只能在一个地方登录

先上帮助类: /// <summary> /// 单点登录帮助类 /// </summary> public class SSOHelper { /// <summary> /// 登录后执行 /// </summary> /// <param name="UserID">用户标识</param> public void LoginRegister(string UserID) { Hashtable hOnlin

java 实现 一个账号只能在一个地方登陆,其他地方被下线

其实方法有很多的,我这献丑了. 使用理解java 四大作用域. 思路:理解java 四大作用域的关键. 第一个地方登陆: 1.得到请求的SessionId 和 登陆的 用户名 2.把SessionId 存到application里,用户名存到当前session里 ActionContext ac = ActionContext.getContext(); Map<String, Object> applicationMap=ac.getApplication(); Map<String,

如何限制一个账号同时只能一个人登录

一直以为 限制一个账号同时只能一个人登录 就是单点登录,经过网上查询,一个账号同一时间只能一个人登录和单点登录根本不是一回事. 解决思路: 在数据库中创建一个内存表LoginTable(即数据库存储引擎为membory),包含两个字段(id,loginStr).其中loginStr 用来存储 sessionId.将主键id不要设置成自增的方式. 在创建用户的时候,在内存表LoginTable中添加一条数据,字段id为新建用户在用户表中的主键id,字段loginStr 先设为空 在用户登录成功之后

ASP.NET MVC实现一个用户只能登录一次 单用户登录

现在许多网站都要求登录后才能进行进一步的操作,当不允许多用户同时登录一个帐号时,就需要一种机制,当再登录一个相同的帐号时,前面登录的人被挤下线,或者禁止后面的人登录.这里实现的是前一种功能. 网上有许多文章都有描述如何实现该功能,看过之后,想着自己也动手记录一下吧,这里是参考的原文地址:http://www.cnblogs.com/f23wangj/p/4984302.html 实现原理:在服务器端记录登录的用户ID+SessionID,当重复登录时,根据用户ID用新的SessionID替换掉旧

PPTP VPN 限制一个账号只允许一个用户来登录

创建auth-up文件 vi /etc/ppp/auth-up chmod a+x /etc/ppp/auth-up auth-up脚本内容如下 #!/bin/sh # get the username/ppp line number from the parameters REALDEVICE=$1 USER=$2 # create the directory to keep pid files per user mkdir -p /var/run/pptpd-users # if there

windows 2008 r2 远程桌面一个用户多登录配置

此配置解决一个用户远程桌面登录后另一个用户被踢下线的问题,配置完成后一个用户可以多人远程桌面登录. 1.打开"远程桌面会话主机配置" 2.检查配置 右击"RDP-Tcp",点击"属性","网络适配器"选择"所有使用此协议配置的网络适配器",最大连接数默认为"2". 3.限制每个用户只能进行一个会话 双击"限制每个用户只能进行一个会话",如图,去掉勾. 4.组策略设置&

1.5.2 添加一个用户lidao指定uid为888 禁止用户登录系统 不创建家目录

添加一个用户lidao指定uid为888 禁止用户登录系统 不创建家目录 #添加一个傀儡用户lidao 并指定这个用户的uid为888 [[email protected]~]# #添加一个用户lidao指定uid为888 禁止用户登录系统 不创建家目录 [[email protected]~]# useradd -u 888 -s /sbin/nologin -M lidao888 [[email protected]~]# id lidao888 uid=888(lidao888)gid=8

PHP实现一个账号只能一个用户登录

思路: 用户登录时,将函数session_id()的值写入到数据库中,这样就能始终保证数据库中的session_id的值是最新的登录的用户对应的session _id. 在页面验证用户时,需要验证用户当前的session_id和数据库中session的值是否一致. 举例: 已知有一个账号U,两个用户A和B. 首先A登录账号U,于是用户A登录时,对应的session_id写入到账号U对应的session_id中,此时用户A保持登录状态. 然后B也登录账号U,用户B登录时,对应的session_id

[转]MVC4项目中验证用户登录一个特性就搞定

本文转自:http://www.mrhuo.com/Article/Details/470/A-Attribute-For-MVC4-Project-Used-To-Validate-User-Login 在开发过程中,需要用户登陆才能访问指定的页面这种功能,微软已经提供了这个特性. // 摘要: // 表示一个特性,该特性用于限制调用方对操作方法的访问. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inhe