繁体   English   中英

Spring如何将新的_csrf令牌添加到会话变量?

[英]How can Spring add a new _csrf token to a session variable?

当某人在Spring OAuth2( 此链接中API的源代码)中对 /oauth/authorize进行POST ,将在服务器上更新CSRF令牌。

什么特定的代码语法可用于:
1.)以代码访问新铸造的CSRF令牌?
2.)将新铸造的CSRF令牌的副本分配给惰性会话变量?
3.)随后检索新的会话变量以在其他类中使用?

此要求的上下文是一个控制流,其中涉及通过多个过滤器和控制器进行可变路由,而用户通过/oauth/authorize端点进行了多次传递。 需要将变量保存到会话范围,然后根据算法的需要从会话范围检索并放回请求范围。

可能需要创建和使用上述会话变量的类类型的示例包括:

1.)任何带有@Controller annotation类,
2.) OncePerRequestFilter的任何自定义实现,
3.) DefaultOAuth2RequestFactory任何自定义实现,
4.)和自定义过滤器链中使用的其他类型的类。

这可能是Spring MVC问题,也可能是Spring Security问题,或者两者兼有,即使它涉及Spring OAuth2 API,其源代码也由Spring MVC和Spring Security构建而成。

Spring Security文档对此进行了详细介绍。 您可以使用标题部分包括CSRF令牌访问令牌 本节的摘要:

  • 解决此问题的一种方法是使用_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 (使用CsrfRequestDataValueProcessor )。 有关详细信息,请参见自动包含令牌
  • Spring Security提供了CsrfTokenResolver ,它可以自动为Spring MVC参数解析当前的CsrfToken 通过使用@EnableWebSecurity您将自动将其添加到Spring MVC配置中。 如果使用基于XML的配置,则必须自己添加。

一旦CsrfTokenResolver配置正确,你可以暴露CsrfToken到你的静态HTML基础的应用。

@RestController
public class CsrfController {

    @RequestMapping("/csrf")
    public CsrfToken csrf(CsrfToken token) {
        return token;
    }
}

保持CsrfToken对其他域的秘密非常重要。 这意味着,如果您使用跨源共享(CORS),则不应将CsrfToken公开给任何外部域。

这是OP要求的:

1.)检索CSRF令牌,如下所示:

ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
CsrfToken csrf = (CsrfToken) attr.getRequest().getAttribute(CsrfToken.class.getName());

2)然后对令牌执行任何您想要的操作。 (轻信一下,知道自己在做什么,这样就不会造成混乱。)也许将csrf令牌放在一个类的代码中的惰性会话变量中,然后将其保留在那里,直到需要将其拉到另一个类中为止。码。

3.)然后(可能在控制流中其他地方的不同类的代码中)将令牌放回请求中,如下所示:

attr.setAttribute("_csrf", csrf, RequestAttributes.SCOPE_REQUEST);
RequestContextHolder.setRequestAttributes(attr);

以上将用于清理自定义处理的副作用。 例如,一种情况是先保存旧请求,然后在DefaultOAuth2RequestFactoryOncePerRequestFilter的自定义实现中DefaultOAuth2RequestFactory OncePerRequestFilter ,但是csrf令牌值在旧请求的创建时间和新请求之间发生了变化,因此csrf值需要先在旧请求中进行更新,然后才能将其添加到控制流中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM