如何使用Spring Security手动验证用户的方法示例
1.概述
在这篇快速文章中,我们将重点介绍如何以编程方式在SpringSecurity和SpringMVC中设置经过身份验证的用户。
2.SpringSecurity
简而言之,SpringSecurity在ThreadLocal中保存每个经过身份验证的用户的主要信息-保存的是Authentication对象。
为了构造和设置此Authentication对象,通常我们需要使用SpringSecurity在标准身份验证上构建对象的相同方法。
要让我们手动触发身份验证,然后将生成的身份验证对象设置为框架用来保存当前登录用户的当前SecurityContext:
UsernamePasswordAuthenticationTokenauthReq =newUsernamePasswordAuthenticationToken(user,pass); Authenticationauth=authManager.authenticate(authReq); SecurityContextsc=SecurityContextHolder.getContext(); securityContext.setAuthentication(auth);
在上下文中设置身份验证后,我们现在可以使用securityContext.getAuthentication()。isAuthenticated()检查当前用户是否经过身份验证。
3.SpringMVC
默认情况下,SpringSecurity在SpringSecurity过滤器链中添加了一个额外的过滤器。它能够持久化Security上下文(SecurityContextPersistenceFilter类)。
反过来,它将Security上下文的持久性委托给SecurityContextRepository的实例,默认为HttpSessionSecurityContextRepository类。
因此,为了在请求上设置身份验证并因此使其可用于来自客户端的所有后续请求,我们需要在HTTP会话中手动设置包含身份验证的SecurityContext:
publicvoidlogin(HttpServletRequestreq,Stringuser,Stringpass){ UsernamePasswordAuthenticationTokenauthReq =newUsernamePasswordAuthenticationToken(user,pass); Authenticationauth=authManager.authenticate(authReq); SecurityContextsc=SecurityContextHolder.getContext(); sc.setAuthentication(auth); HttpSessionsession=req.getSession(true); session.setAttribute(SPRING_SECURITY_CONTEXT_KEY,sc); }
SPRING_SECURITY_CONTEXT_KEY是静态导入的HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY。
应该注意的是,我们不能直接使用HttpSessionSecurityContextRepository-因为它与SecurityContextPersistenceFilter一起使用。
这是因为过滤器使用存储库来加载和存储Security上下文在前,在链中执行其余已定义的过滤器在后,但是它在传递给链的响应上使用自定义包装器。。
因此,在这种情况下,您应该知道所使用的包装器的类类型,并将其传递给存储库中的相应save方法。
4.总结
在这个快速教程中,我们讨论了如何在SpringSecurity上下文中手动设置用户身份验证以及如何使其可用于SpringMVC的目标。专注于代码示例,说明实现它的最简单方法。
与往常一样,可以在GitHub上找到代码示例。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。