Мы добавили Spring Security
к нашему существующему проекту.
С этого момента мы получаем ошибку 401 No 'Access-Control-Allow-Origin' header is present on the requested resource
с нашего сервера.
Это потому, что к ответу не прикреплен заголовок Access-Control-Allow-Origin
. Чтобы исправить это, мы добавили собственный фильтр, который находится в цепочке Filter
перед фильтром выхода, но фильтр не применяется для наших запросов.
Наша ошибка:
XMLHttpRequest не может загрузить
http://localhost:8080/getKunden
. В запрошенном ресурсе нет заголовка "Access-Control-Allow-Origin". Происхождениеhttp://localhost:3000
, следовательно, не допускается. В ответе был код статуса HTTP 401.
Наша конфигурация безопасности:
@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 {
}
}
Наш фильтр
@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);
}
}
Наше приложение
@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();
}
}
Наш фильтр зарегистрирован из spring -boot:
2016-11-04 09: 19: 51.494 INFO 9704 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean: Фильтр отображения: 'myFilter' to: [/*]
Наша сгенерированная фильтрующая цепочка:
2016-11-04 09: 19: 52.729 INFO 9704 --- [ost-startStop-1] ossweb.DefaultSecurityFilterChain: Создание цепочки фильтров: [email protected]1, [org.springframework.secu[email protected]5d8c5a8a, org.spring[email protected]7d6938f, [email protected]9c, org.springframework.security.web.csrf.CsrfFilter @4af4df11, [email protected], org.[email protected]2330834f, org.sp[email protected]396532d1, org.springframework.[email protected]4fc0f1a2, org.springfram[email protected]2357120f, o[email protected]10867bfb, org.springframework.security.web.access.E xceptionTranslationFilter @4b8bf1fb, org.springfr[email protected]42063cf1]
Ответ: Заголовки ответов
Мы попробовали решение от spring, но это не сработало! Аннотации @CrossOrigin в нашем контроллере тоже не помогли.
Изменить 1:
Пробовал решение от @Piotr Sołtysiak. Фильтр cors не указан в сгенерированной цепочке фильтров, и мы по-прежнему получаем ту же ошибку.
2016-11-04 10: 22: 49.881 INFO 8820 --- [ost-startStop-1] ossweb.DefaultSecurityFilterChain: Создание цепочки фильтров: [email protected]1, [org.springframework.secu[email protected]4c191377, org.spring[email protected]28bad32a, [email protected]668, org.springframework.security.web.csrf.CsrfFilter @288460dd, org.[email protected]1c9cd096, org.springframework.s[email protected]3990c331, org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter @1e8d4ac1, org.springfram[email protected]2d61d2a4, org.sp[email protected]380d9a9b, org.springframework.security.web.servletapi.SecurityContextHo lderAwareRequestFilter @abf2de3, org.springfram[email protected]2a5c161b, o[email protected]3c1fd3e5, org[email protected]3d7055ef, org.springframework. [email protected]]
Btw мы используем spring -security version 4.1.3.!