Конфигурация CORS Spring Security - 404 Нет заголовка «Access-Control-Allow-Origin» на запрошенном ресурсе - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь настроить CORS в своем проекте Java Spring.

Отдельно у меня есть приложение Angular CLI со страницей входа, я хотел бы аутентифицировать пользователя, используя мой Spring API.

Я получаю сообщение об ошибке на клиенте

origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Я получаю это в журнале сервера:

No mapping found for HTTP request with URI [/authenticateUser]

Я пробовал несколько примеров из других потоков, но ошибка клиента нене меняюсь, поэтому я немного запутался, где настроить cors

У меня есть класс AppSecurityConfig, который extends WebSecurityConfigurerAdapter

@Configuration
@EnableWebSecurity
public class AppSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {

    User.UserBuilder users = User.withDefaultPasswordEncoder();

    auth.inMemoryAuthentication()
            .withUser(users.username("user1").password("password").roles("ROLE1"))
            .withUser(users.username("user2").password("password").roles("ROLE2"))
            .withUser(users.username("user3").password("password").roles("ROLE3"));
}

@Override
protected void configure(HttpSecurity http) throws Exception {

    http.cors()
        .and()
        .authorizeRequests()
        .anyRequest()
        .authenticated()
        .and()
        .formLogin()
            .loginPage("/loginPageUrl")
            .loginProcessingUrl("/authenticateUser")
            .permitAll();
}

Мой сервис Angular делает запрос:

authenticateUser(json: any) {
return this.http.post('http://localhost:8085/authenticateUser'
  , json, {headers : new HttpHeaders()
    .set('Authorization', '')
    });

} ​​

Переданный json:

{ username: this.username, password: this.password }

При добавлении следующего метода в мой класс AppSecurityConfig было решено «Нет» Access-Control-Allow-OriginЗаголовок присутствует в запрашиваемом ресурсе.

@Bean
CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Arrays.asList("http://localhost:4200"));
    configuration.setAllowedMethods(Arrays.asList("GET","POST"));
    configuration.addAllowedHeader("content-type");
    configuration.addAllowedHeader("Access-Control-Allow-Origin");
    configuration.addAllowedHeader("Authorization");
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

Ответы [ 2 ]

0 голосов
/ 25 января 2019

По моему мнению, отсутствующий заголовок Access-Control-Allow-Origin не должен иметь ничего общего с проблемой сопоставления отсутствующей конечной точки. Это может быть другой проблемой, но не связанной с CORS.

Сначала вы должны проверить заголовки запросов и ответов на вкладке сети браузера (когда пользовательский интерфейс выполняет запросы к API), чтобы увидеть, действительно ли в ответе отсутствуют связанные с CORS заголовки.

Эти заголовки начинаются с - Access-Control-Allow-*, а тот, который контролирует происхождение - - Access-Control-Allow-Origin

Ваш код конфигурации безопасности, http.cors() пытается добавить CorsFilter в соответствии с приведенной ниже логикой (вставка Java Doc из http.cors())

Добавляет CorsFilter для использования. Если бин по имени corsFilter при условии, что используется CorsFilter. Иначе, если corsConfigurationSource равен определяется, то используется CorsConfiguration. В противном случае, если Spring MVC находится на пути к классам, используется HandlerMappingIntrospector.

Так что, если вы не предоставили то, о чем говорилось выше, вам нужно это предоставить.

См. этот ответ esp. раздел 3. настроить CORS config

Если позволяет время, пройдите через предоставленный Spring фильтр org.springframework.web.filter.CorsFilter, чтобы понять логику.

0 голосов
/ 24 января 2019

Попробуйте это:

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedOrigins("http://domain1.com","http://domain2.com"
                    "http://domain3.com");
    }
}

Добавьте метод addCorsMappings в свой класс конфигурации и задайте разрешенные URL-адреса происхождения, которые являются URL-адресами ваших приложений Angular.

В вашей ситуации это будет:

registry.addMapping("/**").allowedOrigins("http://localhost:4200");

для разрешения запросов из приложения Angular.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...