下面的配置类实现了WebMvcConfigurer接口并重写了addCorsMappings方法。(如此处所述:https://www.baeldung.com/spring-cors)
@Configuration
//@EnableWebMvc <- I tried with and without, no effect
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
}我还拥有一个扩展WebSecurityConfigurerAdapter的配置类:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private CustomUserDetailsService customService = new CustomUserDetailsService();
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.cors().and()
.csrf().disable()
.authorizeRequests()
.antMatchers("/user/signup*").permitAll()
.and()
.authorizeRequests()
.antMatchers("/auth*").permitAll()
.and()
.authorizeRequests()
.antMatchers("/nummern/**").permitAll()
.and()
.authorizeRequests()
.antMatchers("/information/").hasRole("OWNER")
.and()
.authorizeRequests()
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.addFilter(new JwtAuthorizationFilter(authenticationManager()))
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}每当我使用Ajax向授权端点发出HTTP请求时,就会得到以下错误:
CORS策略阻止从源'http://localhost:8080/auth?username=Example&password=Example‘访问http://localhost:8080/auth?username=Example&password=Example 'http://localhost:3000’:请求的资源上不存在“访问控制-允许-原产地”标题。
由于这种方法没有效果,我也尝试了Security 5文档中的方法,但这也不起作用:
https://docs.spring.io/spring-security/site/docs/5.0.5.RELEASE/reference/htmlsingle/#cors
我不确定这是由于我的CORS配置还是某些CSRF配置(就我而言,HttpSecurity配置应该禁用CSRF ):
2020-05-29 13:52:40.377 DEBUG 21056 --- [nio-8080-exec-1] o.s.security.web.FilterChainProxy : /auth?username=Example&password=Example at position 3 of 15 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2020-05-29 13:52:40.378 DEBUG 21056 --- [nio-8080-exec-1] o.s.security.web.FilterChainProxy : /auth?username=Example&password=Example at position 4 of 15 in additional filter chain; firing Filter: 'CsrfFilter'
2020-05-29 13:52:40.381 DEBUG 21056 --- [nio-8080-exec-1] o.s.security.web.csrf.CsrfFilter : Invalid CSRF token found for http://localhost:8080/auth?username=Example&password=Example
2020-05-29 13:52:40.382 DEBUG 21056 --- [nio-8080-exec-1] o.s.s.w.header.writers.HstsHeaderWriter : Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@4ea0d6af
2020-05-29 13:52:40.382 DEBUG 21056 --- [nio-8080-exec-1] w.c.HttpSessionSecurityContextRepository : SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.我已经尝试过针对旧版本的Spring安全版本的各种其他建议的解决方案和CORS配置,但到目前为止,它们都没有对我的问题产生任何影响。
这似乎是一个类似问题的最新解决方案,但对我来说也不管用:
在请求的资源错误上存在Spring引导安全性无‘访问-控制-允许-源’头。
编辑:我尝试使用CORS禁用火狐扩展(以及各种HTTP ),但除了被重定向到/login端点之外,我无法看到任何不同之处,我还试图使用以下方法禁用:
http.httpBasic().disable()我的仍然抛出与上面提到的所有测试用例相同的错误。
编辑#2:我也尝试过:
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("http://localhost:3000");
}
};
}发布于 2020-06-08 09:42:30
显然,应用程序一直在使用默认配置,这导致我的安全配置没有任何效果,因此CSRF/Cors问题。
原因是在我的Application类中错误地放置了@ComponentScan注释。
组件扫描:
2020-06-08 11:28:20.764 DEBUG 5612 --- [ main] s.s.c.a.w.c.WebSecurityConfigurerAdapter : Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).
2020-06-08 11:28:20.787 DEBUG 5612 --- [ main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'authenticated', for any request
2020-06-08 11:28:20.790 DEBUG 5612 --- [ main] o.s.s.w.a.i.FilterSecurityInterceptor : Validated configuration attributes
2020-06-08 11:28:20.791 DEBUG 5612 --- [ main] o.s.s.w.a.i.FilterSecurityInterceptor : Validated configuration attributes没有:
2020-06-08 11:34:56.343 DEBUG 8504 --- [ main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'permitAll', for Ant [pattern='/user/signup*']
2020-06-08 11:34:56.344 DEBUG 8504 --- [ main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'permitAll', for Ant [pattern='/auth*']
2020-06-08 11:34:56.344 DEBUG 8504 --- [ main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'permitAll', for Ant [pattern='/nummern/**']
2020-06-08 11:34:56.344 DEBUG 8504 --- [ main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'hasRole('ROLE_OWNER')', for Ant [pattern='/information/']
2020-06-08 11:34:56.345 DEBUG 8504 --- [ main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'authenticated', for any request发布于 2020-06-02 08:42:43
我认为它不工作,因为您没有添加您的起源(本地主机:3000),允许的起源。所以Spring不知道哪个来源可以访问。
弹簧导轨展示了如何做到这一点:
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");
}
};
}您还可以使用这里指定的第二个选项
https://stackoverflow.com/questions/62086296
复制相似问题