Spring Security: как добавить добавить обработчик Failure

У меня есть вопрос о весенней безопасности.

Теперь я использую Siple siteMinderFilter ограничить доступ к нескольким страницам:

    RequestHeaderAuthenticationFilter siteMinderFilter = new RequestHeaderAuthenticationFilter (ignored);
    siteMinderFilter.setPrincipalRequestHeader("SM_USER");
    siteMinderFilter.setAuthenticationManager(authenticationManager()); 

В случае, если SM_USER не так, я хочу использовать мой SmUserFailureHandler:

@Component
public class SmUserFailureHandler extends SimpleUrlAuthenticationFailureHandler {

private Logger log = Logger.getLogger(SmUserFailureHandler.class);

@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) 
                                                                                                throws IOException, ServletException {
      super.onAuthenticationFailure(request, response, exception);

      log.debug("got AuthenticationException");
      if(exception.getClass().isAssignableFrom(PreAuthenticatedCredentialsNotFoundException.class)) {
      log.debug("got PreAuthenticatedCredentialsNotFoundException");

     } 
   }
}

а потом весной урок конфгурации

@Bean
public SmUserFailureHandler smUserFailureHandler(){
    return new SmUserFailureHandler();
}

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

http.formLogin().loginPage("/my/login/page/").failureHandler(smUserFailureHandler());

но я хочу, чтобы он применялся ко всем ресурсам, которые требуют SM_USER.

Как я могу это реализовать?

1 ответ

Вы работаете с аутентификацией FailureHandler ... аутентификация может быть успешной или нет - вам нет дела до ресурсов. Если аутентификация прошла успешно - у вас есть вошедший в систему пользователь - тогда происходит авторизация, процесс, который проверяет, есть ли у пользователя права на запрошенный ресурс. Вам нужно сгенерировать / обработать AccessDenied ситуацию.

Более простой способ - переопределить логику в обработке AccessDeniedException (но это генерируется для каждого отказа в доступе)

<bean id="exceptionTranslationFilter"
    class="org.springframework.security.ui.ExceptionTranslationFilter">
    <property name="authenticationEntryPoint" ref="authenticationEntryPoint" />
    <property name="accessDeniedHandler" ref="accessDeniedHandler" />
</bean>

<bean id="accessDeniedHandler" class="org.springframework.security.ui.AccessDeniedHandlerImpl">
    <property name="errorPage" value="/noaccess.jsp" />
</bean>

источник: http://forum.spring.io/forum/spring-projects/security/62027-redirect-on-authorization-failure?p=463489

Если вы хотите создать специальное сообщение для данного ресурса, вам придется изменить что-то еще. Может быть, ему нужен только AccessDecisionVoter, но я этим не пользовался.

Другие вопросы по тегам