On 01/22/2010 10:35 PM, Scott Battaglia wrote:
> Your cleanest way is to probably just add another action that 
> accomplishes what you want.
> Cheers,
> Scott
>
> On Fri, Jan 22, 2010 at 6:26 PM, John Thiltges <[email protected] 
> <mailto:[email protected]>> wrote:
>
>     Hi all,
>
>     I'm trying to extend CAS to set a domain-wide cookie on login and
>     remove the cookie on logout.
>

Scott,

Thank you for the advice. I think we've got a working solution for 
setting a domain-wide cookie in CAS 3.4.2. The details and sources are 
below, in hopes it might be useful to others.

Thanks,
John

1) Modify login-webflow.xml to call SendDomainCookieAction, setting 
cookie at login
2) Modify cas-servlet.xml to add interceptor 
ClearDomainCookieInterceptor to /logout
3) Create configuration file domainCookie.xml to configure 
CookieRetrievingCookieGenerator for domain cookie
4) Create Java files for SendDomainCookieAction and 
ClearDomainCookieInterceptor

Modified file: login-webflow.xml
===================================
<action-state id="sendTicketGrantingTicket">
<evaluate expression="sendTicketGrantingTicketAction" />
<transition to="sendDomainCookie" />
</action-state>

<action-state id="sendDomainCookie">
<evaluate expression="sendDomainCookieAction" />
<transition on="success" to="serviceCheck" />
</action-state>
===================================

Modified file: cas-servlet.xml
= Add =============================
<bean id="clearDomainCookieInterceptor" 
class="edu.unl.is.idm.cas.ClearDomainCookieInterceptor"
         p:domainWideCookieGenerator-ref="domainWideCookieGenerator"/>

<bean
     id="handlerMappingLogout"
     
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property
         name="mappings">
<props>
<prop
                 key="/logout">
                 logoutController
</prop>
</props>
</property>
<property
         name="interceptors">
<list>
<ref bean="clearDomainCookieInterceptor" />
</list>
</property>
</bean>
= Remove from handlerMappingC =====
<prop
     key="/logout">
     logoutController
</prop>
===================================

New file: spring-configuration/domainCookie.xml
===================================
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans";
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
        xmlns:p="http://www.springframework.org/schema/p";
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd";>


<bean id="sendDomainCookieAction" 
class="edu.unl.is.idm.cas.SendDomainCookieAction"
         p:domainWideCookieGenerator-ref="domainWideCookieGenerator"/>

<bean id="domainWideCookieGenerator" 
class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
         p:cookieSecure="false"
         p:cookieMaxAge="-1"
         p:cookieName="example_sso"
         p:cookieDomain=".example.edu" />

</beans>
===================================

New file: src/.../SendDomainCookieAction.java
===================================
package edu.unl.is.idm.cas;

import javax.validation.constraints.NotNull;
import org.jasig.cas.web.support.CookieRetrievingCookieGenerator;
import org.springframework.webflow.action.AbstractAction;
import org.springframework.webflow.execution.Event;
import org.springframework.webflow.execution.RequestContext;

import org.springframework.web.util.CookieGenerator;

import org.jasig.cas.web.support.WebUtils;

/**
  * Action that handles the domain-wide cookie creation.
  * This action always returns "success".
  *
  */
public final class SendDomainCookieAction extends AbstractAction {

     @NotNull
     private CookieRetrievingCookieGenerator domainWideCookieGenerator;

     protected Event doExecute(final RequestContext context) {

         
domainWideCookieGenerator.addCookie(WebUtils.getHttpServletResponse(context),
             Long.toString(System.currentTimeMillis(), 36));

         return success();
     }

     public void setDomainWideCookieGenerator(final 
CookieRetrievingCookieGenerator domainWideCookieGenerator) {
         this.domainWideCookieGenerator = domainWideCookieGenerator;
     }
}
===================================

New file: src/.../ClearDomainCookieInterceptor.java
===================================
package edu.unl.is.idm.cas;

import javax.validation.constraints.NotNull;

import org.jasig.cas.web.support.CookieRetrievingCookieGenerator;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ClearDomainCookieInterceptor extends 
HandlerInterceptorAdapter {

     @NotNull
     private CookieRetrievingCookieGenerator domainWideCookieGenerator;

     public boolean preHandle(
             HttpServletRequest request,
             HttpServletResponse response,
             Object handler) throws Exception {

         domainWideCookieGenerator.removeCookie(response);

         return true;
     }

     public void setDomainWideCookieGenerator(final 
CookieRetrievingCookieGenerator domainWideCookieGenerator) {
         this.domainWideCookieGenerator = domainWideCookieGenerator;
     }
}
===================================


-- 
You are currently subscribed to [email protected] as: 
[email protected]
To unsubscribe, change settings or access archives, see 
http://www.ja-sig.org/wiki/display/JSG/cas-user

Reply via email to