Страницы

Поиск по вопросам

среда, 17 июля 2019 г.

Spring Security: как поменять HTTP Status для response?

При неудачной авторизации мне необходимо отдавать обратно статус 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)
То же самое можно сделать и силами хэндлера.

Комментариев нет:

Отправить комментарий