#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)
...
}