Изменение конфигурации Spring Security - PullRequest
5 голосов
/ 30 ноября 2011

У нас есть типичное требование в нашем приложении.

У нас есть две конфигурации Spring Security: 1. Сервер CAS 2. LDAP (NTLM)

Итак, теперь нам нужно проверить, доступен ли сервер CAS или нет, и использовать конфигурацию безопасности CAS или LDAP в зависимости от доступности сервера CAS.

Я пытался динамически изменить URL-адрес Entrypoint, однако оба файла конфигурации используют разные bean / классы.

Есть ли другой способ добиться этого?

Пожалуйста, дайте мне знать, как, если мы можем достичь этого и как?

Заранее спасибо.

Raj

1 Ответ

9 голосов
/ 30 ноября 2011

Вы можете создать 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;
    }
}

Затем вы должны подключить DelegatingAuthenticationEntryPoint, используя атрибут entry-point-ref, подобный следующему:

    <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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...