java - Spring 如何向 session 变量添加新的 _csrf token ?

标签 java spring spring-mvc spring-security spring-oauth2

当有人在 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+ 并正在使用 @EnableWebSecurityCsrfToken会自动为您包含在内(使用 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/

相关文章:

java - 无法解包到请求的类型 Javax.Sql.Datasource - Spring hibernate java 配置

java - 从不同的Android项目调用c程序

Java 应用程序无法从命令行发送电子邮件,从 Eclipse 可以

java - 如何在 Spring Web 应用程序中添加乌尔都语语言支持

java - 单元测试 REST 客户端——模拟服务

java - Spring 3.x - @Async 方法不被任务执行器同时调用

java - Spring - 注入(inject) validator bean 时出现问题

java - 将 Java 引用传递到对象链的最佳方式

java - 使用构建器模式进行 Spring 依赖注入(inject)

Spring:注入(inject)bean取决于上下文( session /网络或本地线程/后台进程)