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;
- }
}