weaver      2004/11/30 12:22:21

  Modified:    portal/src/java/org/apache/jetspeed/security/impl
                        SecurityValveImpl.java
  Added:       portal/src/java/org/apache/jetspeed/security/impl
                        AbstractSecurityValve.java
  Log:
  Made the SecurityValve more extensible by creating an abstract class that 
takes care of invoking doPrivileged while requiring
  concrete subclasses to implement logic for retrieving both the principal and 
the subject.
  
  Revision  Changes    Path
  1.12      +71 -88    
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/security/impl/SecurityValveImpl.java
  
  Index: SecurityValveImpl.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/security/impl/SecurityValveImpl.java,v
  retrieving revision 1.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- SecurityValveImpl.java    29 Nov 2004 19:14:45 -0000      1.11
  +++ SecurityValveImpl.java    30 Nov 2004 20:22:21 -0000      1.12
  @@ -16,7 +16,6 @@
   package org.apache.jetspeed.security.impl;
   
   import java.security.Principal;
  -import java.security.PrivilegedAction;
   import java.util.HashSet;
   import java.util.Set;
   
  @@ -25,10 +24,7 @@
   
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
  -import org.apache.jetspeed.PortalReservedParameters;
  -import org.apache.jetspeed.pipeline.PipelineException;
  -import org.apache.jetspeed.pipeline.valve.AbstractValve;
  -import org.apache.jetspeed.pipeline.valve.ValveContext;
  +import org.apache.jetspeed.pipeline.valve.SecurityValve;
   import org.apache.jetspeed.profiler.Profiler;
   import org.apache.jetspeed.request.RequestContext;
   import org.apache.jetspeed.security.SecurityException;
  @@ -41,9 +37,11 @@
    * SecurityValve
    * 
    * @author <a href="mailto:[EMAIL PROTECTED]">David Sean Taylor </a>
  + * @author <a href="mailto:[EMAIL PROTECTED]">Randy Walter </a>
  + * @author <a href="mailto:[EMAIL PROTECTED]">Scott T. Weaver</a>
    * @version $Id$
    */
  -public class SecurityValveImpl extends AbstractValve implements 
org.apache.jetspeed.pipeline.valve.SecurityValve
  +public class SecurityValveImpl extends AbstractSecurityValve implements 
SecurityValve
   {
       private static final Log log = 
LogFactory.getLog(SecurityValveImpl.class);
       private Profiler profiler;
  @@ -55,101 +53,86 @@
           this.userMgr = userMgr;
       }
   
  +    public String toString()
  +    {
  +        return "SecurityValve";
  +    }
  +    
       /**
  -     * @see 
org.apache.jetspeed.pipeline.valve.Valve#invoke(org.apache.jetspeed.request.RequestContext,
  -     *          org.apache.jetspeed.pipeline.valve.ValveContext)
  +     * 
  +     * <p>
  +     * getSubject
  +     * </p>
  +     * Check for previously established session subject and
  +     * invalidate if subject and current user principals do
  +     * not match
  +     * @param request
  +     * @return 
        */
  -public void invoke(RequestContext request, ValveContext context) throws 
PipelineException
  +    protected final Subject getSubject(RequestContext request)
       {
  -
  -            // initialize/validate security subject
  -
  -            // access request user principal if defined or default
  -            // to profiler anonymous user
  -            Principal userPrincipal = 
request.getRequest().getUserPrincipal();
  -            if (userPrincipal == null)
  +        HttpSession session = request.getRequest().getSession();
  +        Principal userPrincipal = getUserPrincipal(request);
  +        
  +        Subject subject = getSubjectFromSession(request);
  +        if (subject != null)
  +        {
  +            Principal subjectUserPrincipal = 
SecurityHelper.getPrincipal(subject, UserPrincipal.class);
  +            if ((subjectUserPrincipal == null) || 
!subjectUserPrincipal.getName().equals(getUserPrincipal(request).getName()))
               {
  -                userPrincipal = new 
UserPrincipalImpl(userMgr.getAnonymousUser());
  +                subject = null;
               }
  -
  -            // check for previously established session subject and
  -            // invalidate if subject and current user principals do
  -            // not match
  -            HttpSession session = request.getRequest().getSession();
  -            Subject subject = (Subject) 
session.getAttribute(PortalReservedParameters.SESSION_KEY_SUBJECT);
  -            if (subject != null)
  +        }
  +        
  +        // create new session subject for user principal if required
  +        if (subject == null)
  +        {
  +            // attempt to get complete subject for user principal
  +            // from user manager
  +            try
               {
  -                Principal subjectUserPrincipal = 
SecurityHelper.getPrincipal(subject, UserPrincipal.class);
  -                if ((subjectUserPrincipal == null) || 
!subjectUserPrincipal.getName().equals(userPrincipal.getName()))
  -                {
  -                    subject = null;
  -                }
  -            }
  -
  -            // create new session subject for user principal if required
  -            if (subject == null)
  -            {
  -                // attempt to get complete subject for user principal
  -                // from user manager
  -                try
  -                {
  -                    User user = userMgr.getUser(userPrincipal.getName());
  -                    if ( user != null )
  -                    {
  -                        subject = user.getSubject();
  -                    }
  -                }
  -                catch (SecurityException sex)
  +                User user = userMgr.getUser(userPrincipal.getName());
  +                if ( user != null )
                   {
  -                    subject = null;
  +                    subject = user.getSubject();
                   }
  -           
  -                
  -                // if subject not available, generate default subject using
  -                // request or default profiler anonymous user principal
  -                if (subject == null)
  -                {
  -                    Set principals = new HashSet();
  -                    principals.add(userPrincipal);
  -                    subject = new Subject(true, principals, new HashSet(), 
new HashSet());
  -                }
  -
  -                // establish session subject
  -                
session.setAttribute(PortalReservedParameters.SESSION_KEY_SUBJECT, subject);
               }
  -
  -            // set request context subject
  -            request.setSubject(subject);
  -            
  -            // Pass control to the next Valve in the Pipeline and execute 
under
  -            // the current subject
  -            final ValveContext vc = context;
  -            final RequestContext rc = request;            
  -            PipelineException pe = (PipelineException) 
Subject.doAsPrivileged(subject, new PrivilegedAction()
  +            catch (SecurityException sex)
               {
  -                public Object run() 
  -                {
  -                     try
  -                    {
  -                        vc.invokeNext(rc);                 
  -                        return null;
  -                    }
  -                    catch (PipelineException e)
  -                    {
  -                        return e;
  -                    }                    
  -                }
  -            }, null);
  +                subject = null;
  +            }       
               
  -            if(pe != null)
  +            // if subject not available, generate default subject using
  +            // request or default profiler anonymous user principal
  +            if (subject == null)
               {
  -                throw pe;
  -            }       
  -
  +                Set principals = new HashSet();
  +                principals.add(userPrincipal);
  +                subject = new Subject(true, principals, new HashSet(), new 
HashSet());
  +            }           
  +        }
  +        
  +        return subject;
       }
  -    public String toString()
  +    
  +    /**
  +     * 
  +     * <p>
  +     * getUserPrincipal
  +     * </p>
  +     * Aaccess request user principal if defined or default
  +     * to profiler anonymous user
  +     * @param request
  +     * @return
  +     */
  +    protected final Principal getUserPrincipal(RequestContext request)
       {
  -        return "SecurityValve";
  +        Principal userPrincipal = request.getRequest().getUserPrincipal();
  +        if (userPrincipal == null)
  +        {
  +            userPrincipal = new 
UserPrincipalImpl(userMgr.getAnonymousUser());
  +        }
  +        return userPrincipal;
       }
   
   }
  
  
  
  1.1                  
jakarta-jetspeed-2/portal/src/java/org/apache/jetspeed/security/impl/AbstractSecurityValve.java
  
  Index: AbstractSecurityValve.java
  ===================================================================
  /*
   * Created on Nov 30, 2004
   *
   * TODO To change the template for this generated file go to
   * Window - Preferences - Java - Code Generation - Code and Comments
   */
  package org.apache.jetspeed.security.impl;
  
  import java.security.Principal;
  import java.security.PrivilegedAction;
  
  import javax.security.auth.Subject;
  
  import org.apache.jetspeed.PortalReservedParameters;
  import org.apache.jetspeed.pipeline.PipelineException;
  import org.apache.jetspeed.pipeline.valve.AbstractValve;
  import org.apache.jetspeed.pipeline.valve.SecurityValve;
  import org.apache.jetspeed.pipeline.valve.ValveContext;
  import org.apache.jetspeed.request.RequestContext;
  
  /**
   * <p>
   * AbstractSecurityValve
   * </p>
   * <p>
   *
   * </p>
   * @author <a href="mailto:[EMAIL PROTECTED]">Scott T. Weaver</a>
   * @version $Id: AbstractSecurityValve.java,v 1.1 2004/11/30 20:22:21 weaver 
Exp $
   *
   */
  public abstract class AbstractSecurityValve extends AbstractValve implements 
SecurityValve
  {
      /**
       * 
       * <p>
       * getSubject
       * </p>
       *  Should build and return a <code>javax.security.Subject</code>
       * @param request
       * @return Subject
       */
      protected abstract Subject getSubject(RequestContext request);
      
      /**
       * 
       * <p>
       * getUserPrincipal
       * </p>
       * Should build and return a <code>java.security.Principal</code> that 
represents the user name
       * the Subject returned from <code>getSubject()</code> 
       * @param request
       * @return Principal
       */
      protected abstract Principal getUserPrincipal(RequestContext request);
      
      /**
       * 
       * <p>
       * getSubjectFromSession
       * </p>
       * 
       * @param request
       * @return javax.security.Subject or <code>null</code> if there is no 
servlet session attribute defined
       * for the key 
<code>org.apache.jetspeed.PortalReservedParameters.SESSION_KEY_SUBJECT</code>.
       */
      protected final Subject getSubjectFromSession(RequestContext request)
      {
          return (Subject) 
request.getRequest().getSession().getAttribute(PortalReservedParameters.SESSION_KEY_SUBJECT);
      }
  
      /**
       * <p>
       * invoke
       * </p>
       * 
       * <p>
       * Uses <code>getSubject()</code> to call 
<code>ValveContext.invokeNext()</code> via 
       * <code>Subject.doAsPrivileged()</code>.  This method also takes care of 
setting the value of
       * the <code>RequestContext.subject</code> property and the session 
attribute 
       * 
<code>org.apache.jetspeed.PortalReservedParameters.SESSION_KEY_SUBJECT</code>
       * </p>
       *
       * @see 
org.apache.jetspeed.pipeline.valve.Valve#invoke(org.apache.jetspeed.request.RequestContext,
 org.apache.jetspeed.pipeline.valve.ValveContext)
       * @param request
       * @param context
       * @throws PipelineException if the is an error encountered during any 
security operations.
       */
      public void invoke( RequestContext request, ValveContext context ) throws 
PipelineException
      {
              // initialize/validate security subject
              Subject subject = getSubject(request);
      
              
request.getRequest().setAttribute(PortalReservedParameters.SESSION_KEY_SUBJECT, 
subject);
              // set request context subject
              request.setSubject(subject);
              
              // Pass control to the next Valve in the Pipeline and execute 
under
              // the current subject
              final ValveContext vc = context;
              final RequestContext rc = request;            
              PipelineException pe = (PipelineException) 
Subject.doAsPrivileged(subject, new PrivilegedAction()
              {
                  public Object run() 
                  {
                       try
                      {
                          vc.invokeNext(rc);                 
                          return null;
                      }
                      catch (PipelineException e)
                      {
                          return e;
                      }                    
                  }
              }, null);
              
              if(pe != null)
              {
                  throw pe;
              }       
      
      }
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to