我這裡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 SecurityManagerauthc.loginUrl = /login.jspauthc.successUrl = /web/index.jsp#cache managerbuiltInCacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManagersecurityManager=org.apache.shiro.web.mgt.DefaultWebSecurityManagersecurityManager.cacheManager = $builtInCacheManagersecurityManager.sessionManager=$sessionManager#session 必須配置session,強制退出時,通過將session移除實現sessionManager=org.apache.shiro.web.session.mgt.DefaultWebSessionManagersessionManager.sessionDAO=$sessionDAOsessionDAO=org.apache.shiro.session.mgt.eis.MemorySessionDAO# Create ldap realmldapRealm = org.apache.shiro.realm.ldap.JndiLdapRealm#......# Configure JDBC realm datasourcedataSource = org.postgresql.ds.PGPoolingDataSource#.......# Create JDBC realm.jdbcRealm.permissionsLookupEnabled = truejdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealmjdbcRealm.userRolesQuery = ......jdbcRealm.permissionsQuery = ......jdbcRealm.dataSource = $dataSource#self realmlocalAuthorizingRealm = com.redbudtek.shiro.LocalAuthorizingRealmsecurityManager.realms = $ldapRealm, $localAuthorizingRealm
在LocalAuthorizingRealm 中,用戶登錄進行認證之前,先將該用戶的其他session移除:
@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {String userName = (String)authenticationToken.getPrincipal();//處理sessionDefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager();DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)securityManager.getSessionManager();Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions();//獲取當前已登錄的用戶session列表for(Session session:sessions){//清除該用戶以前登錄時保存的sessionif(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信息截圖如下:
此時的登錄的用戶認證已經失效,可以對客戶端做出響應。
以上所述是小編給大家介紹的shiro實現單點登錄(一個用戶同一時刻只能在一個地方登錄),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!