spring session+spring security 实现用户不能重复登录

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

spring session 是为了session共享  后端是几台集群。

直接上配置:

spring-security.xml



		
	
	
	
	
	
	
	
	
	

	
		
		
		
        
		
	

	
		
	

	
	
	
		
	
	
	
        
   		
    

    
        
            
                
                    
                    
                
                
                
                
                    
                
            
        
    


	
		
	

 

有时候会报 SessionFixation的问题 导致登录不上去  就是 session 销毁重建的过程失败 没有创建出新的session 就tomcat集群时会报这个问题 没找到解决方式 。可以注释掉这句

让他不走SessionFixation的方法就行 虽然会导致登陆后 sessionid不变 但是内网的项目无所谓了。

 

用的security 5.0.0

之前用了废弃的方法 导致重定向 空指针 

错误配置如下:

        class="org.springframework.security.web.session.ConcurrentSessionFilter">
       
         
   

百度不靠谱 还得上spring-security 官网才行。 上官网一看例子 ok 调试一下源码 立马发现问题

spring session+spring security 实现用户不能重复登录_第1张图片

旧配置 这个跳转的直接为null导致 500错误。

新配置直接用的response.sendRedirect(url)进行跳转。

登录代码里还得添加手动session注册

@Autowired
	private CompositeSessionAuthenticationStrategy sas;

private void registerTokenIntoSession(User user) throws ServiceException {
		Token token = authorizationService.getUserTokenByUserId(user);
		List authorities = authorizationService.getAuthorities(token.getFunc());
		Authentication auth = new PreAuthenticatedAuthenticationToken(token.getUser().getAccount(), token.getUser(),
				authorities);
		auth.setAuthenticated(true);
		SecurityContextHolder.getContext().setAuthentication(auth);	
		long loginTime = System.currentTimeMillis();
		HttpSession session = servletRequest.getSession();
		session.setAttribute("tUser", token.getUser());
		session.setAttribute("loginUserCode", token.getUser().getUserCode());
		session.setAttribute("token", token);
		session.setAttribute("loginTime", loginTime);
		session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContextHolder.getContext());
		sas.onAuthentication(auth, servletRequest, servletResponse); //重点
		workDTO.put("token", token);
		workDTO.put("loginTime", loginTime);
	}

顺便贴一下 logout

public void logout() {
		HttpSession session = servletRequest.getSession();
		session.removeAttribute("tUser");
		session.removeAttribute("loginUserCode");
		session.removeAttribute("token");
		session.removeAttribute("loginTime");
		Cookie[] cookies = servletRequest.getCookies();
		for(Cookie cookie:cookies){
			if("userId".equals(cookie.getName())){
				Cookie dCookie=new Cookie(cookie.getName(),null);
				dCookie.setValue(null);
				dCookie.setMaxAge(0);//删除登录 cookie
				dCookie.setPath(servletRequest.getContextPath());
				servletResponse.addCookie(dCookie);
			}
		}
		//返回新的logoutToken session标记
		CommonHelper.setLogOutToken(servletResponse,servletRequest,session,true,"logout");
		Authentication auth = SecurityContextHolder.getContext().getAuthentication();
		new SecurityContextLogoutHandler().logout(ActionContext.getContext().getServletRequest(),
				ActionContext.getContext().getServletResponse(), auth);
		
	}

 

转载于:https://my.oschina.net/u/3065626/blog/1790826

你可能感兴趣的:(spring session+spring security 实现用户不能重复登录)