2011-11-30 155 views
5

我們在我們的應用程序中有一個典型的要求。更改彈簧安全配置

我們有兩個Spring Security的配置:1。 CAS服務器 2. LDAP(NTLM)

所以,現在我們需要檢查CAS服務器是否可用與否和使用任何CAS或LDAP安全配置基於CAS服務器的可用性。

我試圖動態更改入口點url,但是,兩個配置文件都使用不同的bean/classes。

有沒有其他辦法可以達到這個目的?

請讓我知道如果我們可以實現這個目標以及如何實現?

在此先感謝。

拉吉

回答

7

您可以創建一個DelegatingAuthenticationEntryPoint,將委託給標準CasAuthenticationEntryPoint如果CAS服務器啓動或以其他方式委託給LoginUrlAuthenticationEntryPoint。實施將看起來像下面

public class DelegatingAuthenticationEntryPoint implements AuthenticationEntryPoint { 
    private AuthenticationEntryPoint casAuthenticationEntryPoint; 
    private AuthenticationEntryPoint ldapAuthenticationEntryPoint; 

    public DelegatingAuthenticationEntryPoint(AuthenticationEntryPoint casAuthenticationEntryPoint, 
     AuthenticationEntryPoint ldapAuthenticationEntryPoint) { 
     this.casAuthenticationEntryPoint = casAuthenticationEntryPoint; 
     this.ldapAuthenticationEntryPoint = ldapAuthenticationEntryPoint; 
    } 

    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) 
     throws IOException, ServletException { 
     if(casServerAvailable()) { 
      casAuthenticationEntryPoint.commence(request, response, authException); 
     } else { 
      ldapAuthenticationEntryPoint.commence(request, response, authException); 
     } 
    } 

    private boolean casServerAvailable() { 
     // TODO implement this method 
     return false; 
    } 
} 

這樣,你會使用類似於下面的入口點-ref屬性接線DelegatingAuthenticationEntryPoint:

<sec:http entry-point-ref="delegateEntryPoint"> 
     ... 
    </sec:http> 
<bean id="delegateEntryPoint" class="sample.DelegatingAuthenticationEntryPoint"> 
    <constructor-arg> 
     <bean class="org.springframework.security.cas.web.CasAuthenticationEntryPoint" 
      p:serviceProperties-ref="serviceProperties" 
      p:loginUrl="https://example.com/cas/login" /> 
    </constructor-arg> 
    <constructor-arg> 
     <bean class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint" 
      p:loginFormUrl="/login"/> 
    </constructor-arg> 
</bean>