Java Spring安全性:如何添加失败处理程序

Java Spring安全性:如何添加失败处理程序,java,spring-mvc,authentication,spring-security,siteminder,Java,Spring Mvc,Authentication,Spring Security,Siteminder,我有一个关于春季安全的问题 现在我使用siplesiteMinderFilter来限制对几个页面的访问: RequestHeaderAuthenticationFilter siteMinderFilter = new RequestHeaderAuthenticationFilter (ignored); siteMinderFilter.setPrincipalRequestHeader("SM_USER"); siteMinderFilter.setAuthenti

我有一个关于春季安全的问题

现在我使用siple
siteMinderFilter
来限制对几个页面的访问:

    RequestHeaderAuthenticationFilter siteMinderFilter = new RequestHeaderAuthenticationFilter (ignored);
    siteMinderFilter.setPrincipalRequestHeader("SM_USER");
    siteMinderFilter.setAuthenticationManager(authenticationManager()); 
在SM_用户错误的情况下,我希望使用我的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();
}
但现在我无法理解如何将其包含在我的authenticationProvider中。我发现使用这种FailureHandler的唯一位置是登录表单

http.formLogin().loginPage("/my/login/page/").failureHandler(smUserFailureHandler());
但我希望它适用于所有需要SM_用户的资源


如何实现它?

您正在使用身份验证FailureHandler。。。身份验证可以成功,也可以不成功-您不关心资源。如果身份验证成功-您拥有已登录的用户-则存在授权,即检查用户是否拥有请求资源的权限的过程。您需要生成/处理拒绝访问的情况

更简单的方法是重写处理AccessDeniedException时的逻辑(但这是为每一次拒绝访问生成的)


资料来源:

如果您想为给定的资源生成特殊消息,那么您必须更改其他内容。也许它只需要一个AccessDecisionVoter,但我没有用过

<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>