apache shiroログイン(すべてのオンラインユーザーを取得し、同じユーザーの最後のログイン情報を消去)

12354 ワード

apache shiro同じユーザーの前回ログイン情報をクリア
製品は単一のユーザーの多重同時登録を制限することを要求しています.ここでの解決策は、ユーザーが同じ場所にしかログインできないことです.もし前に他のマシンやブラウザにログインしていたら、前にログインしたユーザーを排除します.
デフォルトのshiro構成に次の構成を追加します(apache shiroを使用し、shiroを使用してログイン機能を正常に実装したと仮定します):applicationContext-shiro.xml .
 
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

<property name="realm" ref="shiroDbRealm" />

<property name="cacheManager" ref="shiroCacheManager" />

<property name="sessionManager" ref="sessionManager" />
bean>

<bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.MemorySessionDAO"/>

<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">

<property name="sessionDAO" ref="sessionDAO"/>

bean>

:sessionDAOはorgを使用する.apache.shiro.session.mgt.eis.MemorySessionDAO、orgは使用できないことを覚えておいてください.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAOは、このクラスを使用する場合、ユーザーを蹴り出す役割も果たしますが、後にログインしたユーザーは2、3分おきにsessionが自動的に失効します.覚えておいて!覚えておいて!覚えておいて!ShiroDbRealm
ShiroDbRealmでの認証方法には、現在のログイン名から取得する前に同じログイン名でログインしたセッションを使用することを主な目的とするコードが追加されています.
1.まずShirodbRealmにbean SessionDAOを注入する
@Autowired
private SessionDAO sessionDAO;

doGetAuthenticationInfoメソッド を書き換える.
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authToken) throws AuthenticationException {
	//         
	String username = (String)authToken.getPrincipal();
		//apache shiro        
			Collection<Session> sessions = sessionDAO.getActiveSessions();
			for(Session session:sessions){
				String loginName = String.valueOf(session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY));
				//                   ,     
				if (SecurityUtils.getSubject().getSession().getId().equals(session.getId()))break;
				//  session          
				if(username.equalsIgnoreCase(loginName)){ //   username        username
					session.setTimeout(0);//  session    ,       
//					logger.info("  :"+userInfo.get("name")+" session    ,       ");
					break;
				}
			}
	}

apache shiroすべてのオンラインユーザーを取得
以下に を示す.
Collection<Session> sessions = sessionDAO.getActiveSessions();

for(Session session:sessions){

System.out.println("  ip:"+session.getHost());

System.out.println("    "+session.getAttribute(DefaultWebContext.PRINCIPALS_SESSION_KEY));

System.out.println("      :"+session.getLastAccessTime());

}