User: starksm 
  Date: 01/06/11 00:04:15

  Modified:    src/main/org/jboss/ejb/plugins SecurityInterceptor.java
  Added:       src/main/org/jboss/ejb/plugins SecurityProxyInterceptor.java
  Log:
  Break out the cutom security proxy integration into a seperate interceptor
  
  Revision  Changes    Path
  1.16      +9 -109    jboss/src/main/org/jboss/ejb/plugins/SecurityInterceptor.java
  
  Index: SecurityInterceptor.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/SecurityInterceptor.java,v
  retrieving revision 1.15
  retrieving revision 1.16
  diff -u -r1.15 -r1.16
  --- SecurityInterceptor.java  2001/05/10 03:19:54     1.15
  +++ SecurityInterceptor.java  2001/06/11 07:04:15     1.16
  @@ -6,48 +6,30 @@
    */
   package org.jboss.ejb.plugins;
   
  -import java.lang.reflect.InvocationTargetException;
   import java.lang.reflect.Method;
  -import java.lang.reflect.UndeclaredThrowableException;
   import java.rmi.RemoteException;
  -import java.security.AccessControlContext;
  -import java.security.AccessController;
   import java.security.Principal;
   import java.util.Iterator;
   import java.util.Set;
  -import javax.ejb.EJBContext;
  -import javax.ejb.EntityContext;
  -import javax.ejb.SessionContext;
   import javax.naming.InitialContext;
  -import javax.security.auth.Subject;
   
   import org.jboss.ejb.Container;
  -import org.jboss.ejb.ContainerInvokerContainer;
   import org.jboss.ejb.MethodInvocation;
  -
   import org.jboss.logging.Logger;
   
   import org.jboss.security.EJBSecurityManager;
   import org.jboss.security.RealmMapping;
   import org.jboss.security.SecurityAssociation;
  -import org.jboss.security.SecurityProxy;
  -import org.jboss.security.SecurityProxyFactory;
   
  -/** The SecurityInterceptor is where the EJB declarative security model
  -is enforced. It is also the layer where user's can introduce custom
  -security via the SecurityProxy delegation model.
  +/** The SecurityInterceptor is where the EJB 2.0 declarative security model
  +is enforced.
   
   @author <a href="[EMAIL PROTECTED]">Oleg Nitz</a>
   @author [EMAIL PROTECTED]
  -@version $Revision: 1.15 $
  +@version $Revision: 1.16 $
   */
   public class SecurityInterceptor extends AbstractInterceptor
   {
  -    /** The JNDI name of the SecurityProxyFactory used to wrap security
  -        proxy objects that do not implement the SecurityProxy interface
  -     */
  -    public final String SECURITY_PROXY_FACTORY_NAME = "java:/SecurityProxyFactory";
  -
       /**
        * @clientCardinality 0..1
        * @supplierCardinality 1 
  @@ -68,13 +50,6 @@
        */
       protected RealmMapping realmMapping;
   
  -    /**
  -     * @supplierCardinality 0..1
  -     * @clientCardinality 1 
  -     * @supplierQualifier custom security
  -     */
  -    protected SecurityProxy securityProxy;
  -
       public SecurityInterceptor()
       {
       }
  @@ -84,47 +59,6 @@
           this.container = container;
           securityManager = container.getSecurityManager();
           realmMapping = container.getRealmMapping();
  -        Object secProxy = container.getSecurityProxy();
  -        if( secProxy != null )
  -        {
  -            /* If this is not a SecurityProxy instance then use the default
  -                SecurityProxy implementation
  -            */
  -            if( (secProxy instanceof SecurityProxy) == false )
  -            {
  -                try
  -                {
  -                    // Get default SecurityProxyFactory from JNDI at
  -                    InitialContext iniCtx = new InitialContext();
  -                    SecurityProxyFactory proxyFactory = (SecurityProxyFactory) 
iniCtx.lookup(SECURITY_PROXY_FACTORY_NAME);
  -                    securityProxy = proxyFactory.create(secProxy);
  -                }
  -                catch(Exception e)
  -                {
  -                    System.out.println("Failed to initialze DefaultSecurityProxy");
  -                    e.printStackTrace();
  -                }
  -            }
  -            else
  -            {
  -                securityProxy = (SecurityProxy) secProxy;
  -            }
  -
  -            // Initialize the securityProxy
  -            try
  -            {
  -                ContainerInvokerContainer ic = (ContainerInvokerContainer) 
container;
  -                Class beanHome = ic.getHomeClass();
  -                Class beanRemote = ic.getRemoteClass();
  -                securityProxy.init(beanHome, beanRemote, securityManager);
  -            }
  -            catch(Exception e)
  -            {
  -                System.out.println("Failed to initialze SecurityProxy");
  -                e.printStackTrace();
  -            }
  -            System.out.println("Initialized SecurityProxy="+securityProxy);
  -        }
       }
   
       public Container getContainer()
  @@ -142,54 +76,20 @@
       {
           // Authenticate the subject and apply any declarative security checks
           checkSecurityAssociation(mi, true);
  -        // Apply any custom security checks
  -        if( securityProxy != null )
  -        {
  -            EJBContext ctx = mi.getEnterpriseContext().getEJBContext();
  -            Object[] args = mi.getArguments();
  -            securityProxy.setEJBContext(ctx);
  -            try
  -            {
  -                securityProxy.invokeHome(mi.getMethod(), args);
  -            }
  -            catch(SecurityException e)
  -            {
  -                Principal principal = mi.getPrincipal();
  -                String msg = "SecurityProxy.invokeHome exception, 
principal="+principal;
  -                Logger.error(msg);
  -                SecurityException se = new SecurityException(msg);
  -                throw new RemoteException("SecurityProxy.invokeHome failure", se);
  -            }
  -        }
           return getNext().invokeHome(mi);
       }
       public Object invoke(MethodInvocation mi) throws Exception
       {
           // Authenticate the subject and apply any declarative security checks
           checkSecurityAssociation(mi, false);
  -        // Apply any custom security checks
  -        if( securityProxy != null )
  -        {
  -            Object bean = mi.getEnterpriseContext().getInstance();
  -            EJBContext ctx = mi.getEnterpriseContext().getEJBContext();
  -            Object[] args = mi.getArguments();
  -            securityProxy.setEJBContext(ctx);
  -            try
  -            {
  -                securityProxy.invoke(mi.getMethod(), args, bean);
  -            }
  -            catch(SecurityException e)
  -            {
  -                Principal principal = mi.getPrincipal();
  -                String msg = "SecurityProxy.invoke exception, principal="+principal;
  -                Logger.error(msg);
  -                SecurityException se = new SecurityException(msg);
  -                throw new RemoteException("SecurityProxy.invoke failure", se);
  -            }
  -        }
           return getNext().invoke(mi);
       }
   
  +    /** The EJB 2.0 declarative security algorithm:
  +     1. Authenticate the caller using the principal and credentials in the 
MethodInfocation
  +     2. Validate access to the method by checking the principal's roles against
  +        those required to access the method.
  +     */
       private void checkSecurityAssociation(MethodInvocation mi, boolean home)
           throws Exception
       {
  @@ -206,7 +106,7 @@
           // Check the security info from the method invocation
           Principal principal = mi.getPrincipal();
           Object credential = mi.getCredential();
  -        if( principal == null || securityManager.isValid(principal, credential) == 
false )
  +        if( securityManager.isValid(principal, credential) == false )
           {
               String msg = "Authentication exception, principal="+principal;
               Logger.error(msg);
  
  
  
  1.1                  
jboss/src/main/org/jboss/ejb/plugins/SecurityProxyInterceptor.java
  
  Index: SecurityProxyInterceptor.java
  ===================================================================
  /*
   * JBoss, the OpenSource EJB server
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
  package org.jboss.ejb.plugins;
  
  import java.lang.reflect.Method;
  import java.rmi.RemoteException;
  import java.security.Principal;
  import javax.ejb.EJBContext;
  import javax.naming.InitialContext;
  
  import org.jboss.ejb.Container;
  import org.jboss.ejb.ContainerInvokerContainer;
  import org.jboss.ejb.MethodInvocation;
  
  import org.jboss.security.EJBSecurityManager;
  import org.jboss.security.SecurityProxy;
  import org.jboss.security.SecurityProxyFactory;
  
  /** The SecurityProxyInterceptor is where the EJB custom security proxy
  integration is performed. This interceptor is dynamically added to container
  interceptors when the deployment descriptors specifies a security
  proxy. It is added just before the container interceptor so that the
  interceptor has access to the EJB instance and context.
  
  @author [EMAIL PROTECTED]
  @version $Revision: 1.1 $
  */
  public class SecurityProxyInterceptor extends AbstractInterceptor
  {
      /** The JNDI name of the SecurityProxyFactory used to wrap security
          proxy objects that do not implement the SecurityProxy interface
       */
      public final String SECURITY_PROXY_FACTORY_NAME = "java:/SecurityProxyFactory";
  
      /**
       * @clientCardinality 0..1
       * @supplierCardinality 1 
       */
      protected Container container;
      protected EJBSecurityManager securityManager;
  
      /**
       * @supplierCardinality 0..1
       * @clientCardinality 1 
       * @supplierQualifier custom security
       */
      protected SecurityProxy securityProxy;
  
      public SecurityProxyInterceptor()
      {
      }
  
      public void setContainer(Container container)
      {
          this.container = container;
          securityManager = container.getSecurityManager();
          Object secProxy = container.getSecurityProxy();
          if( secProxy != null )
          {
              /* If this is not a SecurityProxy instance then use the default
                  SecurityProxy implementation
              */
              if( (secProxy instanceof SecurityProxy) == false )
              {
                  try
                  {
                      // Get default SecurityProxyFactory from JNDI at
                      InitialContext iniCtx = new InitialContext();
                      SecurityProxyFactory proxyFactory = (SecurityProxyFactory) 
iniCtx.lookup(SECURITY_PROXY_FACTORY_NAME);
                      securityProxy = proxyFactory.create(secProxy);
                  }
                  catch(Exception e)
                  {
                      System.out.println("Failed to initialze DefaultSecurityProxy");
                      e.printStackTrace();
                  }
              }
              else
              {
                  securityProxy = (SecurityProxy) secProxy;
              }
  
              // Initialize the securityProxy
              try
              {
                  ContainerInvokerContainer ic = (ContainerInvokerContainer) container;
                  Class beanHome = ic.getHomeClass();
                  Class beanRemote = ic.getRemoteClass();
                  securityProxy.init(beanHome, beanRemote, securityManager);
              }
              catch(Exception e)
              {
                  System.out.println("Failed to initialze SecurityProxy");
                  e.printStackTrace();
              }
              System.out.println("Initialized SecurityProxy="+securityProxy);
          }
      }
  
      public Container getContainer()
      {
          return container;
      }
  
     // Container implementation --------------------------------------
      public void start() throws Exception
      {
          super.start();
      }
  
      public Object invokeHome(MethodInvocation mi) throws Exception
      {
          // Apply any custom security checks
          if( securityProxy != null )
          {
              EJBContext ctx = mi.getEnterpriseContext().getEJBContext();
              Object[] args = mi.getArguments();
              securityProxy.setEJBContext(ctx);
              try
              {
                  securityProxy.invokeHome(mi.getMethod(), args);
              }
              catch(SecurityException e)
              {
                  Principal principal = mi.getPrincipal();
                  String msg = "SecurityProxy.invokeHome exception, 
principal="+principal;
                  System.err.println(msg);
                  SecurityException se = new SecurityException(msg);
                  throw new RemoteException("SecurityProxy.invokeHome failure", se);
              }
          }
          return getNext().invokeHome(mi);
      }
      public Object invoke(MethodInvocation mi) throws Exception
      {
          // Apply any custom security checks
          if( securityProxy != null )
          {
              Object bean = mi.getEnterpriseContext().getInstance();
              EJBContext ctx = mi.getEnterpriseContext().getEJBContext();
              Object[] args = mi.getArguments();
              securityProxy.setEJBContext(ctx);
              try
              {
                  securityProxy.invoke(mi.getMethod(), args, bean);
              }
              catch(SecurityException e)
              {
                  Principal principal = mi.getPrincipal();
                  String msg = "SecurityProxy.invoke exception, principal="+principal;
                  System.err.println(msg);
                  SecurityException se = new SecurityException(msg);
                  throw new RemoteException("SecurityProxy.invoke failure", se);
              }
          }
          return getNext().invoke(mi);
      }
  
  }
  
  
  

_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to