CorsWebFilter не работает с защищенными маршрутами, которым назначен hasAnyRole (...), но работает с теми, которые назначены с помощью allowAll () - PullRequest
1 голос
/ 02 февраля 2020

Однако все маршруты работают, когда я использую почтальон. Но в моем приложении javascript работают только открытые маршруты (те, которые с allowAll ()), и защищенные маршруты возвращают ошибку ниже, даже когда я передаю правильный токен JWT.

Доступ к XMLHttpRequest в 'http://localhost: 8181 / apiv1 / shopping / find / user / 5e2f5814ef8203356e078e16 'origin' http://localhost: 8080 'заблокировано политикой CORS: No' Access-Control-Allow Заголовок -Origin 'присутствует в запрашиваемом ресурсе.

Вот моя весенняя конфигурация безопасности:

@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
class AppSecurity(val authManager: AuthenticationManager,
                  val securityContextRepository: SecurityContextRepository) {

    @Bean
    fun securityWebFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
        return http.csrf().disable()
                .formLogin().disable()
                .httpBasic().disable()
                .authenticationManager(authManager)
                .securityContextRepository(securityContextRepository)
                .authorizeExchange()
                .pathMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                .pathMatchers(HttpMethod.POST, "/apiv1/user", "/apiv1/user/login").permitAll()
                .pathMatchers(HttpMethod.GET, "/apiv1/user", "/apiv1/user/**").permitAll()
                .pathMatchers(HttpMethod.POST, "/apiv1/shopping/**").hasAnyRole("ROLE_CLIENT", "ROLE_ADMIN")
                .pathMatchers(HttpMethod.GET, "/apiv1/shopping/**").hasAnyRole("ROLE_CLIENT", "ROLE_ADMIN")
                .anyExchange().authenticated()
                .and().build()
    }

    @Bean
    fun corsWebFilter(): CorsWebFilter {
        val corsConfig = CorsConfiguration()
        corsConfig.allowCredentials = true
        corsConfig.allowedOrigins = mutableListOf("*")
        corsConfig.allowedMethods = mutableListOf("*")
        corsConfig.allowedHeaders = mutableListOf("*")

        val source = UrlBasedCorsConfigurationSource()
        source.registerCorsConfiguration("/**", corsConfig)

        return CorsWebFilter(source)
    }
}

1 Ответ

1 голос
/ 02 февраля 2020

Мне удалось это исправить, следуя официальной документации по ссылке ниже. Суть в том, что CORS должен быть обработан до пружинной безопасности.

https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#cors

Вот мой окончательный код:

@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
class AppSecurity(val authManager: AuthenticationManager,
                  val securityContextRepository: SecurityContextRepository) {

    @Bean
    fun securityWebFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
        return http.cors(Customizer.withDefaults()).csrf().disable()
                .formLogin().disable()
                .httpBasic().disable()
                .authenticationManager(authManager)
                .securityContextRepository(securityContextRepository)
                .authorizeExchange()
                .pathMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                .pathMatchers(HttpMethod.POST, "/apiv1/user", "/apiv1/user/login").permitAll()
                .pathMatchers(HttpMethod.GET, "/apiv1/user", "/apiv1/user/**").permitAll()
                .pathMatchers(HttpMethod.POST, "/apiv1/shopping/**").hasAnyRole("ROLE_CLIENT", "ROLE_ADMIN")
                .pathMatchers(HttpMethod.GET, "/apiv1/shopping/**").hasAnyRole("ROLE_CLIENT", "ROLE_ADMIN")
                .anyExchange().authenticated()
                .and().build()
    }

    @Bean
    fun corsConfigurationSource(): CorsConfigurationSource {
        val configuration = CorsConfiguration()
        configuration.allowCredentials = true
        configuration.allowedOrigins = mutableListOf("*")
        configuration.allowedMethods = mutableListOf("*")
        configuration.allowedHeaders = mutableListOf("*")
        val source = UrlBasedCorsConfigurationSource()
        source.registerCorsConfiguration("/**", configuration)
        return source
    }
}
...