使用弹簧安全性在后端启用 CORS 的正确方法是啥。在 REST 框架的项目中也使用 Apache cxf
Posted
技术标签:
【中文标题】使用弹簧安全性在后端启用 CORS 的正确方法是啥。在 REST 框架的项目中也使用 Apache cxf【英文标题】:What is the proper way to enable CORS on back end using spring security. Also using Apache cxf in the project for REST framework使用弹簧安全性在后端启用 CORS 的正确方法是什么。在 REST 框架的项目中也使用 Apache cxf 【发布时间】:2019-06-05 16:03:23 【问题描述】:我有以下代码 sn-p(以及其他一些配置)。还应该做些什么?来自chrome的错误是: “对预检请求的响应未通过访问控制检查:请求的资源上不存在 'Access-Control-Allow-Origin' 标头。”
SC: Screenshot for ResponseHeaders from the page to which rxjs(Using angular) call is made
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)
protected class OAuth2SecurityConfiguration extends WebSecurityConfigurerAdapter
@Override
protected void configure(HttpSecurity http) throws Exception
http
.cors().and()
.csrf().disable()
.anonymous().disable()
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS,"/oauth/token").permitAll();
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
protected CorsConfigurationSource corsConfigurationSource()
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowCredentials(true);
configuration.setMaxAge((long) 3600);
configuration.addAllowedOrigin("*");
//configuration.setAllowedOrigins(Arrays.asList("*"));
configuration.setAllowedMethods(Arrays.asList("*"));
//configuration.setAllowedMethods(Arrays.asList("GET","POST","OPTIONS", "DELETE"));
configuration.setAllowedHeaders(Arrays.asList("*"));
//configuration.setAllowedHeaders(Arrays.asList( "x-requested-with","X-requested-with", "authorization", "cache-control", "Content-Type,adminUserId"));
configuration.setExposedHeaders(Arrays.asList("Access-Control-Allow-Origin","Access-Control-Allow-Credentials"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
@Configuration
@EnableResourceServer
protected class ResourceServer extends ResourceServerConfigurerAdapter
@Autowired
@Qualifier("dataSource")
DataSource dataSource;
@Bean
public TokenStore tokenStore()
return new JdbcTokenStore(dataSource);
@Override
public void configure(HttpSecurity http) throws Exception
http
.anonymous().disable()
.requestMatchers().antMatchers("/rest/services/messagePosting/**")
.and().authorizeRequests()
.antMatchers("/rest/services/messagePosting/**")
.authenticated()
.and().exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler());
@Override
public void configure(ResourceServerSecurityConfigurer resources)
throws Exception
resources.resourceId("my-rest-services");
【问题讨论】:
@dur 响应代码是 200 我正在添加一些我们正在使用的配置。 【参考方案1】:更新:此解决方案仅适用于 Spring-boot。
不记得确切的场景,但我猜是在 OAuth2 配置中,当我在扩展 WebSecurityConfigurerAdapter
的配置类中配置 CORS 时遇到了类似的问题,但这没有帮助。
我找到的解决方案是在一个单独的 java 类中配置 CORS,并将该类导入你的 spring 安全配置类。如下:
@Configuration
public class CorsConfig
@Bean
public FilterRegistrationBean<Filter> customCorsFilter()
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<Filter>(new CorsFilter(source));
bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return bean;
您的安全配置类(注意导入注释):
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)
@Import(CorsConfig.class)
protected class OAuth2SecurityConfiguration extends WebSecurityConfigurerAdapter
@Override
protected void configure(HttpSecurity http) throws Exception
http
.cors().and()
.csrf().disable()
.anonymous().disable()
.authorizeRequests()
.antMatchers(HttpMethod.OPTIONS,"/oauth/token").permitAll();
【讨论】:
FilterRegistrationBean 类在哪里?春季启动?我们没有使用弹簧靴。 是的,它是一个 Spring 引导类。添加此答案。 有什么理由拒绝投票吗?这是 Spring-boot 应用程序的一个经过尝试的解决方案,我在这里清楚地提到了“spring-boot”。我没有删除答案,它可能对 Spring-boot 用户有用。以上是关于使用弹簧安全性在后端启用 CORS 的正确方法是啥。在 REST 框架的项目中也使用 Apache cxf的主要内容,如果未能解决你的问题,请参考以下文章