|  | @@ -18,6 +18,9 @@ package net.sf.acegisecurity.ui.webapp;
 | 
	
		
			
				|  |  |  import net.sf.acegisecurity.Authentication;
 | 
	
		
			
				|  |  |  import net.sf.acegisecurity.ui.AbstractIntegrationFilter;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +import java.util.Iterator;
 | 
	
		
			
				|  |  | +import java.util.List;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  import javax.servlet.ServletRequest;
 | 
	
		
			
				|  |  |  import javax.servlet.http.HttpServletRequest;
 | 
	
		
			
				|  |  |  import javax.servlet.http.HttpSession;
 | 
	
	
		
			
				|  | @@ -53,6 +56,13 @@ import javax.servlet.http.HttpSession;
 | 
	
		
			
				|  |  |   * request.
 | 
	
		
			
				|  |  |   * </p>
 | 
	
		
			
				|  |  |   * 
 | 
	
		
			
				|  |  | + * <P>
 | 
	
		
			
				|  |  | + * The filter can also copy the <code>Authentication</code> object to any
 | 
	
		
			
				|  |  | + * number of additional <code>HttpSession</code> attributes. To use this
 | 
	
		
			
				|  |  | + * capability, provide <code>String</code>s indicating the additional
 | 
	
		
			
				|  |  | + * attribute name(s) to {@link #setAdditionalAttributes(List)}.
 | 
	
		
			
				|  |  | + * </p>
 | 
	
		
			
				|  |  | + * 
 | 
	
		
			
				|  |  |   * <p>
 | 
	
		
			
				|  |  |   * See {@link AbstractIntegrationFilter} for further information.
 | 
	
		
			
				|  |  |   * </p>
 | 
	
	
		
			
				|  | @@ -65,8 +75,21 @@ public class HttpSessionIntegrationFilter extends AbstractIntegrationFilter {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      public static final String ACEGI_SECURITY_AUTHENTICATION_KEY = "ACEGI_SECURITY_AUTHENTICATION";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    //~ Instance fields ========================================================
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private List additionalAttributes = null;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      //~ Methods ================================================================
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    public void setAdditionalAttributes(List additionalAttributes) {
 | 
	
		
			
				|  |  | +        validateList(additionalAttributes);
 | 
	
		
			
				|  |  | +        this.additionalAttributes = additionalAttributes;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    public List getAdditionalAttributes() {
 | 
	
		
			
				|  |  | +        return additionalAttributes;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      public void commitToContainer(ServletRequest request,
 | 
	
		
			
				|  |  |          Authentication authentication) {
 | 
	
		
			
				|  |  |          if (request instanceof HttpServletRequest) {
 | 
	
	
		
			
				|  | @@ -75,6 +98,7 @@ public class HttpSessionIntegrationFilter extends AbstractIntegrationFilter {
 | 
	
		
			
				|  |  |              if (httpSession != null) {
 | 
	
		
			
				|  |  |                  httpSession.setAttribute(ACEGI_SECURITY_AUTHENTICATION_KEY,
 | 
	
		
			
				|  |  |                      authentication);
 | 
	
		
			
				|  |  | +                updateOtherLocations(httpSession, authentication);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -87,6 +111,9 @@ public class HttpSessionIntegrationFilter extends AbstractIntegrationFilter {
 | 
	
		
			
				|  |  |                  Object authObject = httpSession.getAttribute(ACEGI_SECURITY_AUTHENTICATION_KEY);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  if (authObject instanceof Authentication) {
 | 
	
		
			
				|  |  | +                    updateOtherLocations(httpSession,
 | 
	
		
			
				|  |  | +                        (Authentication) authObject);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                      return authObject;
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -94,4 +121,33 @@ public class HttpSessionIntegrationFilter extends AbstractIntegrationFilter {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          return null;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void updateOtherLocations(HttpSession session,
 | 
	
		
			
				|  |  | +        Authentication authentication) {
 | 
	
		
			
				|  |  | +        if (additionalAttributes == null) {
 | 
	
		
			
				|  |  | +            return;
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        Iterator iter = additionalAttributes.iterator();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        while (iter.hasNext()) {
 | 
	
		
			
				|  |  | +            String attribute = (String) iter.next();
 | 
	
		
			
				|  |  | +            session.setAttribute(attribute, authentication);
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    private void validateList(List newAdditionalAttributes) {
 | 
	
		
			
				|  |  | +        if (newAdditionalAttributes != null) {
 | 
	
		
			
				|  |  | +            Iterator iter = newAdditionalAttributes.iterator();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            while (iter.hasNext()) {
 | 
	
		
			
				|  |  | +                Object objectToTest = iter.next();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                if (!(objectToTest instanceof String)) {
 | 
	
		
			
				|  |  | +                    throw new IllegalArgumentException(
 | 
	
		
			
				|  |  | +                        "List of additional attributes can only contains Strings!");
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |  }
 |