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