簡體   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