如何使用Spring Security手动认证用户
最后修改:2020年8月15日,
1.概述
在这篇快速文章中,我们将重点讨论如何以编程方式在Spring Security和Spring MVC中设置经过身份验证的用户。
2.Spring Security
简单地说,Spring Security在a中保存每个经过身份验证的用户的主体信息ThreadLocal-以身份验证对象。
为了构造和设置它身份验证对象——我们需要使用Spring Security通常使用的方法,在标准身份验证上构建对象。
为了,让我们手动触发身份验证,然后设置结果身份验证对象转换为当前SecurityContext框架用来保存当前登录的用户:
UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass);认证auth = authManager.authenticate(authReq);SecurityContext sc = SecurityContextHolder.getContext();sc.setAuthentication(身份验证);
设置后身份验证在上下文中,我们现在可以检查当前用户是否通过身份验证.isAuthenticated securityContext.getAuthentication () ()。
3.Spring MVC
默认情况下,Spring Security在Spring Security filter链中添加了一个额外的过滤器——它能够持久化安全上下文(SecurityContextPersistenceFilter类)。
然后,它将安全上下文的持久性委托给的实例SecurityContextRepository,默认为HttpSessionSecurityContextRepository类。
因此,为了在请求上设置身份验证,使其可用于客户机的所有后续请求,我们需要手动设置SecurityContext包含身份验证在HTTP会话中:
public void login(HttpServletRequest req, String user, String pass) {UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(user, pass);认证auth = authManager.authenticate(authReq);SecurityContext sc = SecurityContextHolder.getContext();sc.setAuthentication(身份验证);HttpSession session = req.getSession(true);会话。setAttribute (SPRING_SECURITY_CONTEXT_KEY, sc);}
SPRING_SECURITY_CONTEXT_KEY是静态导入的吗HttpSessionSecurityContextRepository。SPRING_SECURITY_CONTEXT_KEY。
应该指出的是,我们不能直接使用HttpSessionSecurityContextRepository-因为它和SecurityContextPersistenceFilter。
这是因为过滤器使用存储库,以便在执行链中的其余已定义过滤器之前和之后加载和存储安全上下文,但它对传递给链的响应使用自定义包装器。
因此,在本例中,您应该知道所使用的包装器的类类型,并将其传递给存储库中适当的保存方法。
4.结论
在这个快速教程中,我们学习了如何手动设置用户身份验证在Spring安全上下文中,以及如何为Spring MVC目的提供它,重点关注说明实现它的最简单方法的代码示例。
一如既往,可以找到代码示例在GitHub。