Spring 引导 + 安全:设置允许的来源时否 Access-Control-Allow-Origin header

Spring Boot + Security: No Access-Control-Allow-Origin header when setting allowed origins

我正在使用 Spring Boot v2.1.1.RELEASE 和 Spring Security 并尝试通过 REST 登录应用程序。

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

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

这很好用;我可以将我的登录数据发送到 http://localhost:8080/login 并得到一个正常的响应,带有 session 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 header。 但是,如果我如下指定允许的来源,则响应不包括前面提到的 header:

@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" header仅在请求是从允许的来源发送时才发送,而事实并非如此.我在 http://localhost:8000 上托管 HTML 测试文件,所以我必须将 这个确切的 URL 添加到服务器上允许的来源。不是 localhost,不是 localhost:8000,而是 http://localhost:8000。然后身份验证成功并且 header 也包含在响应中。

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

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

如果不是,请 post 来自浏览器控制台的错误。 另外,如果您可以 post 请求和响应 headers

那就太好了