当有人在 Spring OAuth2 ( Source code for the API at this link ) 中对 /oauth/authorize
执行 POST
时,CSRF token 会在服务器上更新。
什么特定的代码语法可用于:
1.) 在代码中访问新创建的 CSRF token ?
2.) 将新创建的 CSRF token 的副本分配给惰性 session 变量?
3.) 随后检索新的 session 变量以在不同的类中使用?
此要求的上下文是一个控制流,涉及通过多个过滤器和 Controller 的变量路由,同时用户多次通过 /oauth/authorize
端点。变量需要保存到 session 范围,然后根据算法的需要从 session 范围中检索并放回到请求范围中。
可能需要创建和使用上述 session 变量的类类型示例包括:
1.) 任何带有 @Controller annotation
的类,
2.) OncePerRequestFilter 的任何自定义实现,
3.) DefaultOAuth2RequestFactory
的任何自定义实现,
4.) 以及自定义过滤器链中使用的其他类型的类。
这可能是 Spring MVC 问题或 Spring Security 问题,或两者兼而有之,即使它涉及 Spring OAuth2 API,其源代码是由 Spring MVC 和 Spring Security 构建的。
最佳答案
Spring Security 文档详细介绍了这一点。您可以使用部分标题 Include the CSRF Token 访问 token 。本节摘要:
- 解决此问题的一种方法是使用 _csrf 请求属性获取当前的 CsrfToken。下面显示了使用 JSP 执行此操作的示例:
<c:url var="logoutUrl" value="/logout"/>
<form action="${logoutUrl}"
method="post">
<input type="submit"
value="Log out" />
<input type="hidden"
name="${_csrf.parameterName}"
value="${_csrf.token}"/>
</form>
- 如果您使用 Spring MVC
<form:form>
标签或 Thymeleaf 2.1+ 并正在使用@EnableWebSecurity
,CsrfToken
会自动为您包含在内(使用CsrfRequestDataValueProcessor
)。请参阅Automatic Token Inclusion了解详情。 - Spring Security 提供
CsrfTokenResolver
可以自动解析当前CsrfToken
对于 Spring MVC 参数。通过使用@EnableWebSecurity
您将自动将其添加到 Spring MVC 配置中。如果您使用基于 XML 的配置,则必须自行添加。
一次CsrfTokenResolver
配置正确后,您可以公开 CsrfToken
到基于静态 HTML 的应用程序。
@RestController
public class CsrfController {
@RequestMapping("/csrf")
public CsrfToken csrf(CsrfToken token) {
return token;
}
}
保留 CsrfToken
很重要来自其他域的 secret 。这意味着如果您使用跨源共享 (CORS),则不应将 CsrfToken 暴露给任何外部域。
关于java - Spring 如何向 session 变量添加新的 _csrf token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37285984/