Spring WebFlux Security Custom AccessDeniedHandler - PullRequest
0 голосов
/ 25 октября 2018

У меня есть конечная точка REST, доступ к которой ограничен только пользователями ADMIN:

@GetMapping
@PreAuthorize("hasAuthority('ADMIN')")
fun getAll(): Flux<User> {
    return Flux.fromIterable(userRepository.findAll())
}

Когда я пытаюсь получить доступ к этой конечной точке с пользователем, не являющимся пользователем ADMIN, я получаю 403 с ответом denied(не JSON-ответ).

Как настроить ответ так, чтобы он все еще получал ответ 403, но с сообщением JSON что-то вроде

{
   "error": "Access denied"
}

SecurityWebFilterChain Я реализую:

return http.csrf().disable()
    .formLogin().disable()
    .httpBasic().disable()
    .authenticationManager(authenticationManager)
    .securityContextRepository(securityContextRepository)
    .exceptionHandling().accessDeniedHandler { exchange, denied -> ???? }
    .and()
    .authorizeExchange()
    .pathMatchers(HttpMethod.OPTIONS).permitAll()
    .pathMatchers("/auth").permitAll()
    .anyExchange().authenticated()
    .and().csrf().disable()
    .logout().disable()
    .build()

1 Ответ

0 голосов
/ 25 октября 2018

Вы можете создать собственный фильтр и изменить ответ, когда вы получите ошибку 403.Примерно так:

class AuthorizationModifierFilter : Filter {
    ....

    fun doFilter(request: ServletRequest, response: ServletResponse, chain: FilterChain): Unit {
        // Check whether the status code is 403 and modify the response
    }
}

И зарегистрируйте свой фильтр:

return http.csrf().disable()
    .formLogin().disable()
    .httpBasic().disable()
    .authenticationManager(authenticationManager)
    .securityContextRepository(securityContextRepository)
    .exceptionHandling().accessDeniedHandler { exchange, denied -> ???? }
    .and()
    .authorizeExchange()
    .pathMatchers(HttpMethod.OPTIONS).permitAll()
    .pathMatchers("/auth").permitAll()
    .anyExchange().authenticated()
    .and().addFilterAfter(AuthorizationModifierFilter(), UsernamePasswordAuthenticationFilter.java.class)
    .and().csrf().disable()
    .logout().disable()
    .build()
...