Spring启动Angular授权服务器访问 - 继续提供CORS错误

时间:2018-02-24 20:01:41

标签: angular spring-boot spring-security cors spring-security-oauth2

使用“ng serve”我启动一个Angular应用程序。 Angular应用程序使用post来获取Spring Boot(授权)服务器的授权。

无论我尝试什么,我都会继续得到这样的回应:

  

选项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中的addCorsMappings。

@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:添加自定义角色过滤器

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的方式所欺骗。

2 个答案:

答案 0 :(得分:1)

在检查问题中的所有选项后,我终于找到了问题。

将Spring Boot应用程序剥离到最低限度后,我诊断出错误。

该错误表明这是一个CORS错误。但是,事实并非如此。我被这个例子中使用context.path的方式所欺骗。

因此,它看起来像一个CORS错误,但它是一个错误的错误。

答案 1 :(得分:-1)

我有一个类似的问题,我的角度应用程序无法访问我的弹簧启动和

我在安全配置中添加了此方法:

@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");
        }
    };
}

但是我之后转换为使用电子应用程序并且不得不废弃安全性,但我认为你绝对需要角色