Angular 的 Spring Boot 授权服务器访问 - 不断给出 CORS 错误
Posted
技术标签:
【中文标题】Angular 的 Spring Boot 授权服务器访问 - 不断给出 CORS 错误【英文标题】:Spring boot Authorisation server access by Angular - keeps on giving CORS errors 【发布时间】:2018-08-04 15:25:02 【问题描述】:使用“ng serve”我启动了一个 Angular 应用程序。 Angular 应用程序使用帖子在 Spring Boot(授权)服务器上获得授权。
无论我尝试什么,我都会不断收到这样的回复:
OPTIONS http://localhost:9999/oauth/authorize 404 () 加载失败 http://localhost:9999/oauth/authorize:对预检请求的响应 没有通过访问控制检查:没有“Access-Control-Allow-Origin” 请求的资源上存在标头。起源 'http://localhost:4200' 因此不允许访问。响应 有 HTTP 状态码 404。
更新:我会将这篇文章留在网上,因为它可以帮助您逐步解决 CORS(跨源)错误。
我尝试了很多方法来让 Spring Boot 应用程序启用 CORS。
选项 1:在 WebMvcConfigurerAdapter 中添加 CorsMappings。
@SpringBootApplication
@Controller
@SessionAttributes("authorizationRequest")
@EnableWebSecurity
@EnableAuthorizationServer
public class AuthserverApplication extends WebMvcConfigurerAdapter
...
@Override
public void addCorsMappings(CorsRegistry registry)
registry.addMapping("/**");
当您还没有 WebMvcConfigurerAdapter 类时,这是一个变体。将此添加到您的 Spring Boot 应用程序。另请参阅@Maj 的答案。
@Bean
public WebMvcConfigurer corsConfigurer()
return new WebMvcConfigurerAdapter()
@Override
public void addCorsMappings(CorsRegistry registry)
registry.addMapping("/**");
;
当然,您可以启用更细粒度的 Cors。
选项 2:将 cors() 添加到您的 WebSecurity 适配器”
@Configuration
@Order(-20)
protected static class LoginConfig extends WebSecurityConfigurerAdapter
@Autowired
private AuthenticationManager authenticationManager;
@Override
protected void configure(HttpSecurity http) throws Exception
http
.cors()
.and()
.formLogin().loginPage("/login").permitAll()
etc.
.csrf().disable();
选项 3:将 corsBean() 添加到您的安全适配器。
@Bean
CorsConfigurationSource corsConfigurationSource()
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Arrays.asList("http://localhost:4200"));
configuration.setAllowedMethods(Arrays.asList("GET","OPTIONS","PUT","POST"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
选项 4: 将过滤器添加到您的 AuthorizationServerConfigurerAdapter
@Bean
public FilterRegistrationBean corsFilterRegistrationBean()
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(
new CorsFilter(source));
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
选项 5:添加自定义 cors 过滤器
public class WebSecurityCorsFilter implements Filter
@Override
public void init(FilterConfig filterConfig) throws ServletException
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
HttpServletResponse res = (HttpServletResponse) response;
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
res.setHeader("Access-Control-Max-Age", "3600");
res.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type, Accept, x-requested-with, Cache-Control");
chain.doFilter(request, res);
@Override
public void destroy()
在 websecurityconfigurer 中:
@Bean
WebSecurityCorsFilter myCorsFilter()
return new WebSecurityCorsFilter();
@Override
protected void configure(HttpSecurity http) throws Exception
http
.addFilterBefore(myCorsFilter(),
SessionManagementFilter.class)
.cors()
.and()
.formLogin().etc.
选项 6:删除安全性。将 Spring Boot 应用程序减少到最低限度。只是为了做出更好的诊断。将 corsMapping() 添加到 Spring Boot Application 类。
@Bean
public WebMvcConfigurer corsConfigurer()
return new WebMvcConfigurerAdapter()
@Override
public void addCorsMappings(CorsRegistry registry)
registry.addMapping("/**").allowedOrigins("*");
;
public static void main(String[] args)
SpringApplication.run(AuthserverApplication.class, args);
选项 7:Chrome 在该区域存在错误。因此,我尝试从头开始使用 Firefox。
选项 8:将 Spring Boot 应用程序转换为 Web 应用程序。 没有。没有不同。
选项 9:控制器路径错误?
这真的是 CORS 错误还是指示错误 REST 路径的错误?
在我的情况下,错误消息表明这是一个 CORS 错误。但最后,我被示例代码中引入 context.path 的方式欺骗了。
【问题讨论】:
你如何为 springboot 应用提供服务? Spring Boot 应用程序用作 MAIN() 应用程序。不是通过应用服务器进行的战争。 【参考方案1】:我遇到了一个类似的问题,我的 Angular 应用程序无法访问我的 Spring Boot Backand
我在我的安全配置中添加了这个方法:
@Bean
public WebMvcConfigurer corsConfigurer()
return new WebMvcConfigurerAdapter()
@Override
public void addCorsMappings(CorsRegistry registry)
registry.addMapping("/**")
.allowedOrigins("http://localhost:" + port") // angular port here
.allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH");
;
但是我后来改用了电子应用程序,不得不完全放弃安全性,但我认为你绝对需要 cors
【讨论】:
我也试过这个 - 见“try 1”。我也将它与周围的班级分开,就像你建议的那样,同样的结果。【参考方案2】:在检查了问题中的所有选项后,我终于找到了问题所在。
在将 Spring Boot 应用程序剥离到最低限度后,我诊断出错误。
该错误表明这是一个 CORS 错误。但是,事实并非如此。我被本例中使用 context.path 的方式欺骗了。
所以,它看起来像一个 CORS 错误,但它是一个 WRONG PATH 错误。
【讨论】:
以上是关于Angular 的 Spring Boot 授权服务器访问 - 不断给出 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章
在 Angular 5 应用程序中响应 Spring Boot 时无法读取授权标头
如何使用 Spring Boot 和 Angular 应用程序隐藏授权标头
如何使用 CAS 针对 Spring Boot 后端授权 Angular 5 应用程序
从使用 Angular 7 的请求中接收 Spring Boot 中的空授权标头,但 Postman 工作正常