apache shiro登录(获取所有在线用户和清除同一用户上次登录信息)

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,
使用该类的时候,虽然也能起到踢出用户的作用,但是后登录的用户隔两三分钟就会session自动失效。
切记!切记!切记!

ShiroDbRealm代码示例

在ShiroDbRealm中的认证方法中增加如下代码,代码主要目的就是根据当前登录名获取之前使用同样登录名登录后的session

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());

}

你可能感兴趣的:(java)