Shiro单用户登录,清理之前登录的用户
  TEZNKK3IfmPf 2023年11月13日 21 0

在自定义的realm中的doGetAuthenticationInfo方法中定义,根据传入参数类型的不同选择对应的处理方法

/**
*	new SimpleAuthenticationInfo(user, pwd, this.getName())中的第一个参数是SysUser对象,
*	在其他接收的地方也要转成SysUser对象,使用对象这里对应的处理方式是采用方法一,
*	如果是传递的userName字符串,则采用方法二进行处理
*/
SimpleAuthenticationInfo authcInfo = new SimpleAuthenticationInfo(user, pwd, this.getName()); 

方法一

传入的参数是User对象

/**
 * @功能描述:	单用户登录,清除当前用户以前登录时保存的session会话
 * @param loginName
 */
public void singleUseLogin(String loginName){
	// 1.获取当前用户sessionId
	String currentUserSessionId = SecurityUtils.getSubject().getSession().getId().toString();

	// 2.获取shiro的sessionManager
	DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager();
	DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)securityManager.getSessionManager();

	// 3.获取所有已登录用户的session列表
	Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions();

	if (sessions.size() > 1) {
		System.out.println("仅允许单用户登录,开始清理遗留用户信息~");
		User user = null;
		for(Session onlineSession:sessions){
			// 4. 获取已登录用户的session的key值
			SimplePrincipalCollection simplePrincipalCollection = (SimplePrincipalCollection) onlineSession.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY);
			if (null == simplePrincipalCollection) {
				sessionManager.getSessionDAO().delete(onlineSession);
				continue;
			}
			// 5. 获取new SimpleAuthenticationInfo(user, pwd, this.getName())中放进去的第一个参数
			user = (User) simplePrincipalCollection.getPrimaryPrincipal();

			// 6. 清除当前用户以前登录时保存的session会话
			if (loginName.equals(user.getUserName()) && !onlineSession.getId().equals(currentUserSessionId)) {
				sessionManager.getSessionDAO().delete(onlineSession);
				System.out.println("清理用户["+loginName+"],SessionId为["+onlineSession.getId()+"]的Session信息!");
			}
		}
	} else {
		System.out.println("无可清理用户信息~");
	}
}

方法二

传入的参数是userName字符串

/**
 * @功能描述:	单用户登录,清除当前用户以前登录时保存的session会话
 * @param loginName
 */
public void singleUseLogin(HttpServletRequest request,String loginName){
	// 1.获取当前用户sessionId
	String currentUserSessionId = request.getSession().getId();

	// 2.获取shiro的sessionManager
	DefaultWebSecurityManager securityManager = (DefaultWebSecurityManager) SecurityUtils.getSecurityManager();
	DefaultWebSessionManager sessionManager = (DefaultWebSessionManager)securityManager.getSessionManager();

	// 3.获取所有已登录用户的session列表
	Collection<Session> sessions = sessionManager.getSessionDAO().getActiveSessions();

	// 处理方法一:UserRalm中传入的是userName使用此方法
	String onlineSessionKey = "";
	for(Session onlineSession:sessions){
		// 4.获取已登录用户的session的key值
		onlineSessionKey = String.valueOf(onlineSession.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY));
		// 5.清除当前用户以前登录时保存的session会话
		System.out.println(onlineSession.getId()+"------" + onlineSessionKey);

		if (onlineSessionKey.equals("null")) {
			sessionManager.getSessionDAO().delete(onlineSession);
		} else if (loginName.equals(onlineSessionKey) && !onlineSession.getId().equals(currentUserSessionId)) {
			sessionManager.getSessionDAO().delete(onlineSession);
		}
	}
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   20天前   46   0   0 java
  TEZNKK3IfmPf   2024年05月31日   54   0   0 java
TEZNKK3IfmPf