Spring Boot + Security:设置允许的来源时没有Access-Control-Allow-Origin标头

时间:2019-01-20 13:36:48

标签: java spring-boot spring-security cors response-headers

我将Spring Boot v2.1.1.RELEASE与Spring Security一起使用,并试图通过REST登录到应用程序。

我有一个实现WebMvcConfigurer的配置文件,因此可以覆盖addCorsMappings方法:

@Override
public void addCorsMappings(final CorsRegistry registry) {
    registry.addMapping("/**");
}

这很好用;我可以将登录数据发送到http://localhost:8080/login并获得正常的响应,包括会话cookie和所有内容:

Access-Control-Allow-Origin: *
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Length: 0
Date: Sun, 20 Jan 2019 13:14:46 GMT
Expires: 0
Pragma: no-cache
Set-Cookie: JSESSIONID=66B74AE4F547BA77604AE199E0A48D7E; Path=/; HttpOnly
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

注意Access-Control-Allow-Origin标头。 但是,如果我按如下方式指定允许的来源,则Response不包括前面提到的标头:

@Override
public void addCorsMappings(final CorsRegistry registry) {
    registry.addMapping("/**").allowedOrigins("localhost");
}

将导致响应:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Content-Length: 20
Date: Sun, 20 Jan 2019 13:15:15 GMT
Expires: 0
Pragma: no-cache
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

我允许哪个来源都没有关系; “ http://localhost”,“ http://example.com”和“ example.com”都得到相同的结果。

在调试时,我注意到在代码中包含allowedOrigins位时,身份验证过程在CorsFilter处停止。

这与登录过程有关!据我所知,我无法使用@CrossOrigin注释,因为我没有办法将其放在上面。

我正在使用以下脚本测试REST登录:https://pastebin.com/YezC3wWr

这是Spring还是设计上的错误?我在这里想念东西吗?

编辑:仅当请求是从允许的来源发送时才发送响应中的“ Access-Control-Allow-Origin”标头,而事实并非如此。我将HTML测试文件托管在http://localhost:8000上,因此必须在服务器上允许的来源中添加此确切URL 。不是localhost,不是localhost:8000,而是http://localhost:8000。然后身份验证成功,并且标头也包含在响应中。

2 个答案:

答案 0 :(得分:1)

如果您在与登录请求相同的域上运行HTML页面,则请求中将没有Origin标头,因此没有Access-Control-Allow-Origin。 您的代码就是这种情况吗?您在http://localhost:8080/下运行HTML文件吗?

如果否,请从浏览器的控制台中发布错误。 另外,如果您可以同时发布请求和响应标头,那就太好了

答案 1 :(得分:0)

尝试使用“ http://localhost:8080”。 您是通过网络浏览器还是直接通过POST(例如Postman)进行测试?