User: stark   
  Date: 01/02/14 13:20:05

  Modified:    security/src/main/org/jboss/ejb/plugins
                        SecurityInterceptor.java
  Log:
  Updated SecurityInterceptor to be independent of any JAAS classes
  and refactored security proxy layer to simplify the model.
  
  Revision  Changes    Path
  1.2       +78 -181   
contrib/security/src/main/org/jboss/ejb/plugins/SecurityInterceptor.java
  
  Index: SecurityInterceptor.java
  ===================================================================
  RCS file: 
/products/cvs/ejboss/contrib/security/src/main/org/jboss/ejb/plugins/SecurityInterceptor.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- SecurityInterceptor.java  2001/02/12 09:21:26     1.1
  +++ SecurityInterceptor.java  2001/02/14 21:20:04     1.2
  @@ -13,16 +13,16 @@
   import java.security.AccessControlContext;
   import java.security.AccessController;
   import java.security.Principal;
  -import java.security.PrivilegedExceptionAction;
  -import java.security.PrivilegedActionException;
   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;
  @@ -30,8 +30,8 @@
   import org.jboss.security.EJBSecurityManager;
   import org.jboss.security.RealmMapping;
   import org.jboss.security.SecurityAssociation;
  -import org.jboss.security.SecurityPolicy;
  -import org.jboss.security.plugins.SubjectSecurityManager;
  +import org.jboss.security.SecurityProxy;
  +import org.jboss.security.SecurityProxyFactory;
   
   /** An alternate implementation of the EJB security interceptor that allows
   for Subject based authorization checks via stateless and stateful proxy
  @@ -41,10 +41,15 @@
   dependent would be better names.
   
   @author [EMAIL PROTECTED]
  -@version $Revision: 1.1 $
  +@version $Revision: 1.2 $
   */
   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 
  @@ -52,11 +57,12 @@
       protected Container container;
       protected EJBSecurityManager securityManager;
       protected RealmMapping realmMapping;
  -    protected Object statelessSecurityProxy;
  -    protected Object statefulSecurityProxy;
  -    protected Method beanSetterMethod;
  -    protected Method statefulContextSetterMethod;
  -    protected Method statelessContextSetterMethod;
  +
  +    /**
  +     * @supplierCardinality 0..1
  +     * @clientCardinality 1 
  +     */
  +    protected SecurityProxy securityProxy;
   
       public SecurityInterceptor()
       {
  @@ -68,11 +74,47 @@
           this.container = container;
           securityManager = container.getSecurityManager();
           realmMapping = container.getRealmMapping();
  -        statelessSecurityProxy = container.getStatelessSecurityProxy();
  -        statefulSecurityProxy = container.getStatefulSecurityProxy();
  -        statelessContextSetterMethod = findContextSetter(statelessSecurityProxy);
  -        statefulContextSetterMethod = findContextSetter(statefulSecurityProxy);
  -        beanSetterMethod = findBeanSetter(statefulSecurityProxy);
  +        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()
  @@ -88,48 +130,31 @@
   
       public Object invokeHome(MethodInvocation mi) throws Exception
       {
  -        // Apply any declarative security checks
  -        checkSecurityAssociation( mi, true );
  +        // 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);
  +            securityProxy.invokeHome(mi.getMethod(), args);
  +        }
           return getNext().invokeHome(mi);
       }
  -    public Object invoke(final MethodInvocation mi) throws Exception
  +    public Object invoke(MethodInvocation mi) throws Exception
       {
  -        // Authenticate the subject and pply any declarative security checks
  +        // Authenticate the subject and apply any declarative security checks
           checkSecurityAssociation(mi, false);
  -        // Get the authenticated subject
  -        SubjectSecurityManager subjectSecurityManager = (SubjectSecurityManager) 
securityManager;
  -        Subject subject = subjectSecurityManager.getActiveSubject();
  -        // Perform any non-declarative security checks
  -        System.out.println("SecurityInterceptor.invoke, s="+subject+", 
slessp="+statelessSecurityProxy+", sfulp="+statefulSecurityProxy);
  -        if( subject != null && (statelessSecurityProxy != null || 
statefulSecurityProxy != null) )
  +        // Apply any custom security checks
  +        if( securityProxy != null )
           {
  -            try
  -            {
  -                String domainName = subjectSecurityManager.getSecurityDomain();
  -                SecurityPolicy.setActiveApp(domainName);
  -                Subject.doAsPrivileged(subject, new PrivilegedExceptionAction()
  -                    {
  -                        public Object run() throws Exception
  -                        {
  -                            // Apply any stateless non-declarative security checks
  -                            if( statelessSecurityProxy != null )
  -                                checkStatelessSecurityProxy(mi);
  -                            // Apply any statelful non-declarative security checks
  -                            if( statefulSecurityProxy != null )
  -                                checkStatefulSecurityProxy(mi);
  -                            return null;
  -                        }
  -                    },
  -                    null
  -                );
  -            }
  -            catch(PrivilegedActionException e)
  -            {
  -                throw e.getException();
  -            }
  +            Object bean = mi.getEnterpriseContext().getInstance();
  +            EJBContext ctx = mi.getEnterpriseContext().getEJBContext();
  +            Object[] args = mi.getArguments();
  +            securityProxy.setEJBContext(ctx);
  +            securityProxy.invoke(mi.getMethod(), args, bean);
           }
  -
  -        // All security checks passed, allow the invocation
           return getNext().invoke(mi);
       }
   
  @@ -149,7 +174,7 @@
           // Check the security info from the method invocation
           Principal principal = mi.getPrincipal();
           Object credential = mi.getCredential();
  -        if( principal == null || !securityManager.isValid(principal, credential) )
  +        if( principal == null || securityManager.isValid(principal, credential) == 
false )
           {
               Logger.error("Authentication exception, principal="+principal);
               SecurityException e = new SecurityException("Authentication exception");
  @@ -162,7 +187,7 @@
           }
   
           Set methodRoles = container.getMethodPermissions(mi.getMethod(), home);
  -        if( methodRoles != null && !realmMapping.doesUserHaveRole(principal, 
methodRoles) )
  +        if( methodRoles != null && realmMapping.doesUserHaveRole(principal, 
methodRoles) == false )
           {
               Logger.error("Illegal access, principal="+principal);
               SecurityException e = new SecurityException("Illegal access exception");
  @@ -170,132 +195,4 @@
           }
      }
   
  -    private void checkStatelessSecurityProxy(MethodInvocation mi)
  -        throws Exception
  -    {
  -        Method method = mi.getMethod();
  -        Object[] args = mi.getArguments();
  -        try
  -        {
  -            if( statelessContextSetterMethod != null )
  -            {
  -                Object[] ctx = { mi.getEnterpriseContext().getEJBContext() };
  -                statelessContextSetterMethod.invoke(statelessSecurityProxy, ctx);
  -            }
  -            method.invoke(statelessSecurityProxy, args);
  -        }
  -        catch(InvocationTargetException e)
  -        {
  -            Throwable t = e.getTargetException();
  -            if( t instanceof SecurityException )
  -                throw new RemoteException("checkStatelessSecurity", t);
  -            else if( t instanceof Exception )
  -                throw (Exception) t;
  -            throw new RemoteException("checkStatelessSecurity, unexpected 
Throwable", t);
  -        }
  -        catch(UndeclaredThrowableException e)
  -        {
  -            Throwable t = e.getUndeclaredThrowable();
  -            if( t instanceof SecurityException )
  -                throw new RemoteException("checkStatelessSecurity", t);
  -            else if( t instanceof Exception )
  -                throw (Exception) t;
  -            throw new RemoteException("checkStatelessSecurity, unexpected 
Throwable", t);
  -        }
  -    }
  -
  -    private void checkStatefulSecurityProxy(MethodInvocation mi)
  -        throws Exception
  -    {
  -        Method method = mi.getMethod();
  -        Object[] args = mi.getArguments();
  -        try
  -        {
  -            if( beanSetterMethod != null )
  -            {   // Set the bean instance the proxy is securing
  -                Object[] bean = { mi.getEnterpriseContext().getInstance() };
  -                beanSetterMethod.invoke(statefulSecurityProxy, bean);
  -            }
  -            if( statefulContextSetterMethod != null )
  -            {
  -                Object[] ctx = { mi.getEnterpriseContext().getEJBContext() };
  -                statefulContextSetterMethod.invoke(statefulSecurityProxy, ctx);
  -            }
  -            method.invoke(statefulSecurityProxy, args);
  -        }
  -        catch(InvocationTargetException e)
  -        {
  -            Throwable t = e.getTargetException();
  -            if( t instanceof SecurityException )
  -                throw new RemoteException("checkStatelessSecurity", t);
  -            else if( t instanceof Exception )
  -                throw (Exception) t;
  -            throw new RemoteException("checkStatelessSecurity, unexpected 
Throwable", t);
  -        }
  -        catch(UndeclaredThrowableException e)
  -        {
  -            Throwable t = e.getUndeclaredThrowable();
  -            if( t instanceof SecurityException )
  -                throw new RemoteException("checkStatelessSecurity", t);
  -            else if( t instanceof Exception )
  -                throw (Exception) t;
  -            throw new RemoteException("checkStatelessSecurity, unexpected 
Throwable", t);
  -        }
  -    }
  -
  -    private Method findContextSetter(Object proxy)
  -    {
  -        if( proxy == null )
  -            return null;
  -
  -        Method m = null;
  -        try
  -        {   // Look for a setContext method that accepts the generic EJBContext
  -            Class[] parameterTypes = {EJBContext.class};
  -            m = proxy.getClass().getMethod("setContext", parameterTypes);
  -        }
  -        catch(Exception e)
  -        {
  -        }
  -        if( m == null )
  -        {
  -            try
  -            {   // Look for a setContext method that accepts a SessionContext
  -                Class[] parameterTypes = {SessionContext.class};
  -                m = proxy.getClass().getMethod("setContext", parameterTypes);
  -            }
  -            catch(Exception e)
  -            {
  -            }
  -        }
  -        if( m == null )
  -        {
  -            try
  -            {   // Look for a setContext method that accepts a EntityContext
  -                Class[] parameterTypes = {EntityContext.class};
  -                m = proxy.getClass().getMethod("setContext", parameterTypes);
  -            }
  -            catch(Exception e)
  -            {
  -            }
  -        }
  -        return m;
  -    }
  -    private Method findBeanSetter(Object proxy)
  -    {
  -        if( proxy == null )
  -            return null;
  -
  -        Method m = null;
  -        try
  -        {   // Look for a setBean method
  -            Class[] parameterTypes = {Object.class};
  -            m = statefulSecurityProxy.getClass().getMethod("setBean", 
parameterTypes);
  -        }
  -        catch(Exception e)
  -        {
  -            Logger.exception(e);
  -        }
  -        return m;
  -    }
   }
  
  
  

Reply via email to