安全上

我刚刚宣布了新消息学习Spring Security课程,包括Spring Security 5中新的OAuth2堆栈的完整材料:

>>查看课程

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

安全底

我刚刚宣布了新消息学习Spring Security课程,包括Spring Security 5中新的OAuth2堆栈的完整材料:

>>查看课程
2评论
最古老的
最新的
内联反馈
查看所有评论
本文评论关闭!