Spring Security:如何添加添加失败处理程序

时间:2016-01-06 11:14:14

标签: java spring-mvc authentication spring-security siteminder

我对弹簧安全性有疑问。

现在我使用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();
}

但现在我无法理解如何在authenticationProvider中包含它。我找到的使用这种FailureHandler的单一位置是登录表单

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

但我想将它应用于所有需要SM_USER的资源。

我该如何实施?

1 个答案:

答案 0 :(得分:0)

您正在使用身份验证 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#post463489

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