2016-01-06 40 views
0

我有一个关于弹簧安全性的问题。Spring Security:如何添加添加失败处理程序

现在我用一个赛普尔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的资源。

我该如何实现它?

回答

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,但我没有使用过。