2016-01-06 64 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,但我沒有使用過。