[英]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.