【发布时间】:2019-06-14 01:50:36
【问题描述】:
我将 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 标头。
但是,如果我按如下方式指定允许的来源,则响应不包含前面提到的标头:
@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”标头仅在请求从允许的来源发送时才会发送,但事实并非如此。我在http://localhost:8000 上托管了HTML 测试文件,所以我必须将这个确切的URL 添加到服务器上允许的来源。不是localhost,不是localhost:8000,而是http://localhost:8000。然后身份验证成功,并且标头也包含在响应中。
【问题讨论】:
标签: java spring-boot spring-security cors response-headers