Hi all,
I am using in my application Spring Security and pac4j to configure CAS for authentication.
I would like to configure two CAS endpoints (both pointing to the same instance).
I want to achieve the following:
When the user browses public pages, Spring Security or CAS is not involved.
When the user requests a secure resource, Spring Security will redirect the browser to CAS (using an endpoint with an external secure url).
Any subsequent request, CAS will be internally called to make sure that the service ticket is valid (using an endpoint with an internal url)
How can I configure the above?
My current configuration is given below:
securityContext.xml
<security:http create-session="always" auto-config="true" pattern="/**" entry-point-ref="casEntryPoint" >
<security:custom-filter before="LOGOUT_FILTER" ref="requestSingleLogoutFilter" />
<security:custom-filter after="CAS_FILTER" ref="clientFilter" />
<security:intercept-url pattern="/**" access='IS_AUTHENTICATED_FULLY' />
<security:logout/>
</security:http>
<bean id="casEntryPoint" class="org.pac4j.springframework.security.web.ClientAuthenticationEntryPoint">
<property name="client" ref="casClient" />
</bean>
<bean id="clientFilter" class="org.pac4j.springframework.security.web.ClientAuthenticationFilter">
<constructor-arg value="/callback"/>
<property name="clients" ref="clients"/>
<property name="authenticationManager" ref="authenticationManager"/>
</bean>
<bean id="clientProvider" class="org.pac4j.springframework.security.authentication.ClientAuthenticationProvider">
<property name="clients" ref="clients"/>
</bean>
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider ref="clientProvider" />
</security:authentication-manager>
<bean id="casSingleSignOutHandler" class="org.pac4j.cas.logout.CasSingleSignOutHandler"/>
SecurityConfig.java
@Bean
public Clients clients(CasClient casClient) {
Clients clients = new Clients();
clients.setCallbackUrl(env.getRequiredProperty("cas.callbackUrl"));
clients.setClients(casClient);
return clients;
}
@Bean
public CasClient casClient(CasSingleSignOutHandler casSingleSignOutHandler) {
CasClient casClient = new CasClient();
casClient.setCasLoginUrl(env.getRequiredProperty("cas.loginUrl"));
casClient.setLogoutHandler(casSingleSignOutHandler);
return casClient;
}
@Bean
public LogoutFilter requestSingleLogoutFilter() {
LogoutFilter logoutFilter = new LogoutFilter(env.getProperty("cas.logoutUrl"), new SecurityContextLogoutHandler());
logoutFilter.setFilterProcessesUrl("/logout");
return logoutFilter;
}