繁体   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