Как обрабатывать ответ hasRole ()

#spring #spring-security

#spring #spring-безопасность

Вопрос:

У меня есть следующая защита hasRole () для antMatchers:

 .antMatchers(HttpMethod.GET, "/api/posts/myPosts").hasRole("USER")
 

Как обрабатывать ответ, если у пользователя нет роли USER? Когда я ОБЩАЮСЬ /api/posts/myPosts с пользователем без роли ПОЛЬЗОВАТЕЛЯ, я получаю ответ:

 {
    "timestamp": "2019-04-14T12:43:31.233 0000",
    "status": 403,
    "error": "Forbidden",
    "message": "Forbidden",
    "path": "/api/posts/myPosts"
}
 

Возможно ли создать собственное исключение и обработать его позже в аннотированном классе @RestControllerAdvice ?

Я попробовал другой способ добиться этого, добавив @PreAuthorize("hasRole('USER')") на уровне метода, затем Spring выдает AccessDeniedException , и все в порядке.

Ответ №1:

Фильтры выполняются еще до того, как контроллеры будут разрешены, поэтому исключения, генерируемые из фильтров, не могут быть перехвачены советом контроллера. Вместо этого создайте точку входа аутентификации, например

 @Component
public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {

    public void commence(HttpServletRequest request,
                         HttpServletResponse response,
                         AuthenticationException ae) throws IOException, ServletException {
       //Here do whatever you want to do with the exception: ae
        response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Access Denied");
    }
}
 

Зарегистрируйте этот CustomAuthenticationEntryPoint в WebSecurityConfigurerAdapter, например

 @Override
public void configure(HttpSecurity http) throws Exception {
        ...
        .antMatchers(HttpMethod.GET, "/api/posts/myPosts").hasRole("USER")
        ...
        .and()
        .exceptionHandling()
        .authenticationEntryPoint(customAuthenticationEntryPoint)
        ...
}