При неудачной авторизации мне необходимо отдавать обратно статус 401. Поскольку у нас в проекте используется Spring Security, то и настройка авторизации настраивается через него:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatcher(ADMIN_MATCHERS)
.authorizeRequests()
.antMatchers(ADMIN_MATCHERS)
.access("hasRole('ADMIN')")
.anyRequest().authenticated()
.and()
.formLogin()
.usernameParameter(USERNAME)
.passwordParameter(PASSWORD)
.loginPage(ADMIN_LOGIN)
.permitAll()
.loginProcessingUrl("/admin/login/auth")
.failureHandler(customAuthFailureHandler)
.successHandler(successHandler())
.and()
.logout()
.logoutUrl("/admin/logout")
.logoutSuccessUrl(ADMIN_LOGIN)
.and()
.exceptionHandling()
.accessDeniedPage(ADMIN_LOGIN)
.and()
.csrf().disable()
.httpBasic();
Для обработки ошибки авторизации я, как мы видим, использовал failureHandler()
И написал кастомный обработчик:
@Component("customAuthFailureHandler")
public class CustomAuthFailureHandler extends SimpleUrlAuthenticationFailureHandler {
private static final String ADMIN_LOGIN = "/admin/login";
private static final Integer STATUS_UNAUTHORIZED = 401;
private static final String RESPONSE_CODE_KEY = "Response-Code";
private static final String RESPONSE_BAD_CREDENTIALS = "bad-credentials";
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
response.setStatus(STATUS_UNAUTHORIZED);
response.addHeader(RESPONSE_CODE_KEY, RESPONSE_BAD_CREDENTIALS);
getRedirectStrategy().sendRedirect(request, response, ADMIN_LOGIN);
}
}
Header пересылается без проблем, но вместо статуса 401 ответом приходит 302. То есть, определённый мной статус где-то затирается. Возможно, не нужно использовать sendRedirect?
Подскажите, пожалуйста, рабочее решение в рамках имеющегося кода.
Ответ
В общем, выяснилось, что можно сделать или переадресацию с, допустим, хэдерами, но без HttpStatus, или добавить HttpStatus, но без переадресации. Так, чтоб был и статус, и переадресация, силами Spring Security сделать нельзя.
Я решил задачу следующим образом: создал другую jsp и поменял в настройках строчку
.failureHandler(customAuthFailureHandler)
на
.failureUrl(ADMIN_LOGIN_FAILED)
То же самое можно сделать и силами хэндлера.
Комментариев нет:
Отправить комментарий