簡體   English   中英

Spring Security未創建CSRF令牌

[英]Spring Security not creating CSRF token

我希望使用Spring Security(版本5.1.2)為Angular 7應用程序生成CSRF令牌。 我的SecurityConfig文件中包含以下內容:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.cors().and()
            .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}

在我的控制器中使用以下RequestMapping:

@RestController
@RequestMapping("/authentication")
public class AuthenticationController {

    @GetMapping("/csrf")
    public void getCsrfToken(){...}

    @PostMapping("/register")
    public RegisterOutputDTO register(@RequestBody UserDTO input){...}
}

我從各種來源收集到了信息, csrfTokenRepository會在我的第一個GET調用中自動生成帶有標頭XSRF-token的cookie(這是/authentication/csrf目的),但是我沒有從服務器獲取cookie。 因此,在下一個POST呼叫中,我收到403響應。 我可能會丟失什么?

這是我的輸出

正如我對問題的評論所指出的那樣,我找到了問題的答案。 Cookie不能跨域發送。

我的前端部署在localhost:3000 ,后端部署在localhost:3000 localhost:9080 ,它們顯然被視為不同的域。 如果我轉到localhost:9080 (我得到一個白頁,但這沒關系),然后轉到Chrome中的“應用程序”標簽,我發現我一直在尋找的XSRF cookie一直存儲着。 該cookie可從我從前端執行的GET調用中獲得。 問題是該cookie需要可用於localhost:3000以便Angular可以使用該cookie。

您可以通過多種方法在本地環境中解決此問題。

使用代理

您可以使用代理將某些網址路徑映射到您的后端。 這是我的解決方案。

我使用webpack開發服務器運行Angular應用程序。 Webpack提供了一種將某些URL代理到后端的簡便方法。 例如:

devServer: {
    contentBase: path.join(__dirname, 'dist'),
    compress: true,
    port: 3000,
    proxy: {
        '/api': 'http://localhost:9080'
    }
}

Angular應用程序在localhost:3000上運行。 任何對localhost:3000/api/*調用。 將轉發到localhost:9080/api/* 因此,就我而言,我不再在localhost:9080/api/authentication/csrf上執行GET調用,而是調用localhost:3000/api/authentication/csrf ,然后將其轉發到我的后端。 (我想將/api添加到我的rest控制器中的路徑中,以示好奇。)

將兩個應用程序部署在同一端口上

使用frontend-maven-plugin可以將前端構建到其dist文件夾,然后讓maven將dist文件夾與后端一起打包以進行部署。 我還沒有嘗試過,但是有很多資源表明使用Spring Boot應該很容易做到這一點。 因此,例如,前端和后端都可以通過localhost:9080獲得。

使用Spring Profile在本地禁用csrf

您可以使用Spring @Profile批注為本地環境和其余環境(測試,驗收,生產)創建不同的配置。 可以直接禁用Csrf進行開發。 我不喜歡該選項,因為我希望盡可能使DEV和其他環境保持相同。 這也不是問題陳述的真正答案。

特別感謝用戶@dspies的回答,這有助於我發現問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM