Search code examples
springspring-securityservlet-filterscasspring-security-cas

Spring Security CAS and HttpBasic, CasAuthentcationProvider not invoked after ticket granted


I have a maven multi-modules application where the main module depends on others. This main module is secured with Spring Security CAS and submodules required a basic authentication. This is a example of the security configuration of a submodule:

<security:http name="boobkingapiHttp" create-session="stateless" pattern="/hub/book/**" 
    authentication-manager-ref="apiAuthenticationManager">
    <security:intercept-url pattern="/hub/book" access="ROLE_ORDER_MANAGER" />
     <security:http-basic />
</security:http>

And the security configuration for the main module:

<security:http entry-point-ref="casEntryPoint" pattern="/**" realm="ecab" use-expressions="false">
    <security:intercept-url pattern="/flow/googlestatistics/**" access="ROLE_ADMIN" />
    <security:intercept-url pattern="/**" access="ROLE_ADMIN" />
    <security:custom-filter position="CAS_FILTER" ref="casFilter" />
    <security:logout logout-success-url="/logout.xhtml"/>
    <security:custom-filter ref="requestSingleLogoutFilter" before="LOGOUT_FILTER"/>
    <security:custom-filter ref="singleLogoutFilter" before="CAS_FILTER"/>
</security:http>

<beans:bean id="casFilter" class="org.springframework.security.cas.web.CasAuthenticationFilter">
    <beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>

<beans:bean id="casEntryPoint" class="org.springframework.security.cas.web.CasAuthenticationEntryPoint">
    <beans:property name="loginUrl" value="http://localhost:8082/sso/login" />
    <beans:property name="serviceProperties" ref="serviceProperties" />
</beans:bean>

<security:authentication-manager alias="authenticationManager">
    <security:authentication-provider ref="casAuthenticationProvider" />
</security:authentication-manager>

<beans:bean id="casAuthenticationProvider" 
class="org.springframework.security.cas.authentication.CasAuthenticationProvider">
    <beans:property name="authenticationUserDetailsService">
        <beans:bean class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper">
            <beans:constructor-arg ref="hwsAuthenticationUserDetailsService" />
        </beans:bean>
    </beans:property>
    <beans:property name="serviceProperties" ref="serviceProperties" />
    <beans:property name="ticketValidator">
        <beans:bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
            <beans:constructor-arg index="0" value="http://localhost:8082/sso" />
        </beans:bean>
    </beans:property>
    <beans:property name="key" value="an_id_for_this_auth_provider_only" />
</beans:bean>

<beans:bean id="serviceProperties" 
  class="org.springframework.security.cas.ServiceProperties">
    <beans:property name="service" value="http://localhost:8080/cas-client/login/cas" />
    <beans:property name="sendRenew" value="false" />
</beans:bean>

The problem is, when the CAS server grants the ticket and redirects to the service url: http://localhost:8080/cas-client/login/cas?ticket=ST-19-1clKw2tZ5MVp0OznfAun the casAuthenticationProvider is not invoked. The one invoked is the submodule's authenticationProvider and the result is 401 Unauthorized error. Why the CAS SecurityFilterChain is not invoked? I thought that was handled by Spring Security CAS but it seems not. I use Spring Security 5.1.2.RELEASE Thanks a lot for your help.


Solution

  • I found the reason why the CasAuthenticationProvider was not invoked. It's just because of this:

    <security:authentication-manager alias="authenticationManager">
       <security:authentication-provider ref="casAuthenticationProvider" />
    </security:authentication-manager>
    

    I changed alias to id.