[英]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令牌访问令牌 。 本节的摘要:
<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>
<form:form>
标记或Thymeleaf 2.1+,并且使用的是@EnableWebSecurity
, CsrfToken
自动为您提供CsrfRequestDataValueProcessor
(使用CsrfRequestDataValueProcessor
)。 有关详细信息,请参见自动包含令牌 。 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);
以上将用于清理自定义处理的副作用。 例如,一种情况是先保存旧请求,然后在DefaultOAuth2RequestFactory
或OncePerRequestFilter
的自定义实现中DefaultOAuth2RequestFactory
OncePerRequestFilter
,但是csrf
令牌值在旧请求的创建时间和新请求之间发生了变化,因此csrf
值需要先在旧请求中进行更新,然后才能将其添加到控制流中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.