Как обработать ответ hasRole () - PullRequest
0 голосов
/ 14 апреля 2019

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

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

Как обрабатывать ответ, если у пользователя нет роли USER? Когда я выполняю GET на /api/posts/myPosts с пользователем без роли USER, я получаю ответ:

{
    "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 Ответ

0 голосов
/ 17 апреля 2019

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

@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)
        ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...