shiro實現(xiàn)單點登錄(一個用戶同一時刻只能在一個地方登錄)
我這里 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移除實現(xiàn) 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 中,用戶登錄進行認(rèn)證之前,先將該用戶的其他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();//獲取當(dāng)前已登錄的用戶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()); }
當(dāng)session刪除之后,必須有客戶端與服務(wù)器端的交互,shiro才能進行認(rèn)證判斷。在與服務(wù)器交互時,subject信息截圖如下:
此時的登錄的用戶認(rèn)證已經(jīng)失效,可以對客戶端做出響應(yīng)。
以上所述是小編給大家介紹的shiro實現(xiàn)單點登錄(一個用戶同一時刻只能在一個地方登錄),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
使用jaxp進行dom解析_動力節(jié)點Java學(xué)院整理
這篇文章主要介紹了使用jaxp進行dom解析的相關(guān)資料,需要的朋友可以參考下2017-08-08Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼
這篇文章主要介紹了Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04SpringMVC4.3?HandlerExceptionResolver異常處理源碼解析
這篇文章主要為大家介紹了SpringMVC4.3?HandlerExceptionResolver異常處理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>2023-09-09Java面向?qū)ο蠡A(chǔ)知識之委托和lambda
這篇文章主要介紹了Java面向?qū)ο蟮闹泻?lambda,文中有非常詳細(xì)的代碼示例,對正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-11-11使用java實現(xiàn)備份和恢復(fù)SQLServer表數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了如何使用java實現(xiàn)備份和恢復(fù)SQLServer表數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01SpringBoot使用@Cacheable出現(xiàn)預(yù)覽工具亂碼的解決方法
直接使用注解進行緩存數(shù)據(jù),我們再使用工具去預(yù)覽存儲的數(shù)據(jù)時發(fā)現(xiàn)是亂碼,這是由于默認(rèn)序列化的問題,所以接下來將給大家介紹一下SpringBoot使用@Cacheable出現(xiàn)預(yù)覽工具亂碼的解決方法,需要的朋友可以參考下2023-10-10