Frühlingssicherheit CORS Filter
Wir fügten hinzuSpring Security
zu unserem bestehenden Projekt.
on diesem Moment an bekommen wir eine 401No 'Access-Control-Allow-Origin' header is present on the requested resource
Fehler von unserem Server.
Das liegt daran, neinAccess-Control-Allow-Origin
er @ -Header ist an die Antwort angehängt. Um dies zu beheben, haben wir unseren eigenen Filter hinzugefügt, der sich im @ befindeFilter
chain vor dem Abmeldefilter, aber der Filter gilt nicht für unsere Anfragen.
Unser Fehler:
XMLHttpRequest kann nicht geladen werdenhttp://localhost:8080/getKunden
. In der angeforderten Ressource ist kein 'Access-Control-Allow-Origin'-Header vorhanden. Ursprunghttp://localhost:3000
ist daher nicht zugänglich. Die Antwort hatte den HTTP-Statuscode 401.
Unsere Sicherheitskonfiguration:
@EnableWebSecurity
@Configuration
@ComponentScan("com.company.praktikant")
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Autowired
private MyFilter filter;
@Override
public void configure(HttpSecurity http) throws Exception {
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
final CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.addAllowedMethod("GET");
config.addAllowedMethod("PUT");
config.addAllowedMethod("POST");
source.registerCorsConfiguration("/**", config);
http.addFilterBefore(new MyFilter(), LogoutFilter.class).authorizeRequests()
.antMatchers(HttpMethod.OPTIONS, "/*").permitAll();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
}
}
Unser Filter
@Component
public class MyFilter extends OncePerRequestFilter {
@Override
public void destroy() {
}
private String getAllowedDomainsRegex() {
return "individual / customized Regex";
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
final String origin = "http://localhost:3000";
response.addHeader("Access-Control-Allow-Origin", origin);
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setHeader("Access-Control-Allow-Headers",
"content-type, x-gwt-module-base, x-gwt-permutation, clientid, longpush");
filterChain.doFilter(request, response);
}
}
Unsere Bewerbung
@SpringBootApplication
public class Application {
public static void main(String[] args) {
final ApplicationContext ctx = SpringApplication.run(Application.class, args);
final AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
annotationConfigApplicationContext.register(CORSConfig.class);
annotationConfigApplicationContext.refresh();
}
}
Unser Filter ist ab Spring-Boot registriert:
2016-11-04 09: 19: 51.494 INFO 9704 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean: Zuordnungsfilter: 'myFilter' zu: [/ *]
Unsere generierte Filterkette:
2016-11-04 09: 19: 52.729 INFO 9704 --- [ost-startStop-1] ossweb.DefaultSecurityFilterChain: Filterkette erstellen: org.springframework.security.web.util.matcher.AnyRequestMatcher@1, [org .springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter @ 5d8c5a8a, org.springframework.security.web.context.SecurityContextPersistenceFilter@7d6938f, org.springframework.security.web.header.weader.spring .web.csrf.CsrfFilter @ 4af4df11, com.company.praktikant.MyFilter@5ba65db2, org.springframework.security.web.authentication.logout.LogoutFilter@2330834f, org.springframework.security.web.savedrequest.re32RefestR .springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter @ 4fc0f1a2, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2357120f, org.springframework.security.web.session.Session10ingManagementFilurity .Ausnahme nTranslationFilter @ 4b8bf1fb, org.springframework.security.web.access.intercept.FilterSecurityInterceptor@42063cf1]
Die Antwort:Response headers
Wir haben die Lösung auch aus dem Frühjahr ausprobiert, aber es hat nicht funktioniert! Die Annotation @CrossOrigin in unserem Controller hat auch nicht geholfen.
Edit 1:Versuchte die Lösung von @Piotr Sołtysiak. Der cors-Filter ist nicht in der generierten Filterkette aufgeführt, und es wird immer noch derselbe Fehler angezeigt.
2016-11-04 10: 22: 49.881 INFO 8820 --- [ost-startStop-1] ossweb.DefaultSecurityFilterChain: Erstellen der Filterkette: org.springframework.security.web.util.matcher.AnyRequestMatcher@1, [org .springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter @ 4c191377, org.springframework.security.web.context.SecurityContextPersistenceFilter@28bad32a, org.springframework.security.web.header .web.csrf.CsrfFilter @ 288460dd, org.springframework.security.web.authentication.logout.LogoutFilter@1c9cd096, org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter@3990c331.wui .DefaultLoginPageGeneratingFilter @ 1e8d4ac1, org.springframework.security.web.authentication.www.BasicAuthenticationFilter@2d61d2a4, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@380.Request reRequestFilter @ abf2de3, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2a5c161b, org.springframework.security.web.session.SessionManagementFilter@3c1fd3e5, org.springframework.security.Exception.efa. security.web.access.intercept.FilterSecurityInterceptor@5d27725a]
Übrigens verwenden wir Spring-Security Version 4.1.3.!