Spring WebFlux Security - возможно ли настроить несколько ServerAuthenticationEntryPoints в SecurityWebFilterChain для разных ресурсов - PullRequest
0 голосов
/ 22 марта 2020

В моем весеннем приложении webflux есть несколько разных API, которые должны по-разному реагировать на неудачную аутентификацию. Я пытаюсь установить разные ServerAuthenticationEntryPoints для каждого API для обработки этих случаев.

Я нашел этот пример конфигурации, которая показывает, как настроить разные AuthenticationWebFilter для разных ресурсов, что позволяет вам установить ServerAuthenticationSuccessHandler и ServerAuthenticationFailureHandler по отдельности, однако я не уверен, как настроить различные ServerAuthenticationEntryPoints, не имея полностью отдельных SecurityWebFilterChains.

Если мне нужно настроить отдельные SecurityWebFilterChains, как мне это сделать?

Моя SecurityWebFilterChain настроена вот так - к сожалению, вы не можете установить исключение по отдельности, а второй вызов authenticEntryPoint имеет прецедент:

@Bean
fun securityWebFilterChain(
    http: ServerHttpSecurity,
    userServerAuthenticationEntryPoint: ServerAuthenticationEntryPoint,
    userAuthenticationWebFilter: AuthenticationWebFilter,
    deviceServerAuthenticationEntryPoint: ServerAuthenticationEntryPoint,
    deviceAuthenticationWebFilter: AuthenticationWebFilter,
    serverSecurityContextRepository: ServerSecurityContextRepository,
    authenticationManager: ReactiveAuthenticationManager,
    serverAccessDeniedHandler: ServerAccessDeniedHandler
): SecurityWebFilterChain {
    http
        .addFilterAt(userAuthenticationWebFilter, SecurityWebFiltersOrder.AUTHENTICATION)
        .exceptionHandling()
            .authenticationEntryPoint(userServerAuthenticationEntryPoint)
            .and()
        .authorizeExchange()
            .pathMatchers(GET, "/sign-in").permitAll()
            .pathMatchers("/authentication/**").permitAll()
            .pathMatchers(GET, "/landing").hasAnyAuthority("USER", "ADMIN")
            .pathMatchers("/user-api/**").hasAnyAuthority("USER", "ADMIN")

    http
        .addFilterAt(deviceAuthenticationWebFilter, SecurityWebFiltersOrder.AUTHENTICATION)
        .exceptionHandling()
            .authenticationEntryPoint(deviceServerAuthenticationEntryPoint)
            .and()
        .authorizeExchange()
            .pathMatchers("/device-api/**").hasAuthority("DEVICE")

    // GLOBAL
    http
        .httpBasic().disable()
        .formLogin().disable()
        .csrf().disable()
        .cors().disable()
        .securityContextRepository(serverSecurityContextRepository)
        .authenticationManager(authenticationManager)
        .exceptionHandling()
            .accessDeniedHandler(serverAccessDeniedHandler)
            .and()
        .authorizeExchange()
            .pathMatchers(GET, "/webjars/**").permitAll()
            .pathMatchers(GET, "/assets/**").permitAll()
            .anyExchange().authenticated()

    return http.build()
}

1 Ответ

0 голосов
/ 23 марта 2020

Оказывается, по умолчанию ServerAuthenticationEntryPoint является DelegatingServerAuthenticationEntryPoint, который позволяет вам настроить через ServerWebExchangeMatchers, какая фактическая точка входа отвечает за любой данный ServerWebExchange. См. этот комментарий .

...