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
那就太好了
我正在使用 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
那就太好了