User: starksm
Date: 01/07/19 03:18:57
Modified: src/main/org/jboss/security/plugins Tag: Branch_2_4
JaasSecurityManager.java
JaasSecurityManagerService.java
Log:
Fix problem with security manager override.
Add support for accessing the active subject from the ENC namespace
Revision Changes Path
No revision
No revision
1.7.2.3 +2 -1
jbosssx/src/main/org/jboss/security/plugins/JaasSecurityManager.java
Index: JaasSecurityManager.java
===================================================================
RCS file:
/cvsroot/jboss/jbosssx/src/main/org/jboss/security/plugins/JaasSecurityManager.java,v
retrieving revision 1.7.2.2
retrieving revision 1.7.2.3
diff -u -r1.7.2.2 -r1.7.2.3
--- JaasSecurityManager.java 2001/07/14 16:50:56 1.7.2.2
+++ JaasSecurityManager.java 2001/07/19 10:18:57 1.7.2.3
@@ -7,6 +7,7 @@
package org.jboss.security.plugins;
import java.io.IOException;
+import java.io.Serializable;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.Iterator;
@@ -51,7 +52,7 @@
@author <a href="[EMAIL PROTECTED]">Oleg Nitz</a>
@author [EMAIL PROTECTED]
-@version $Revision: 1.7.2.2 $
+@version $Revision: 1.7.2.3 $
*/
public class JaasSecurityManager implements SubjectSecurityManager, RealmMapping
{
1.2.2.1 +237 -200
jbosssx/src/main/org/jboss/security/plugins/JaasSecurityManagerService.java
Index: JaasSecurityManagerService.java
===================================================================
RCS file:
/cvsroot/jboss/jbosssx/src/main/org/jboss/security/plugins/JaasSecurityManagerService.java,v
retrieving revision 1.2
retrieving revision 1.2.2.1
diff -u -r1.2 -r1.2.2.1
--- JaasSecurityManagerService.java 2001/06/15 08:26:02 1.2
+++ JaasSecurityManagerService.java 2001/07/19 10:18:57 1.2.2.1
@@ -4,12 +4,14 @@
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
-
+
package org.jboss.security.plugins;
import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
-import java.net.URL;
+import java.lang.reflect.Proxy;
+import java.util.Enumeration;
import java.util.Hashtable;
import java.util.ArrayList;
import java.util.Iterator;
@@ -20,11 +22,16 @@
import javax.naming.RefAddr;
import javax.naming.StringRefAddr;
import javax.naming.Name;
+import javax.naming.NameClassPair;
+import javax.naming.NameParser;
+import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
+import javax.naming.OperationNotSupportedException;
import javax.naming.spi.ObjectFactory;
import javax.naming.spi.NamingManager;
import javax.naming.CommunicationException;
import javax.naming.CannotProceedException;
+import javax.security.auth.Subject;
import javax.management.MBeanServer;
import javax.management.ObjectName;
@@ -32,19 +39,18 @@
import org.jboss.logging.Log;
import org.jboss.security.SecurityAssociation;
import org.jboss.security.SecurityProxyFactory;
+import org.jboss.security.SubjectSecurityManager;
import org.jboss.util.ServiceMBeanSupport;
-import org.jnp.server.NamingServer;
-import org.jnp.interfaces.NamingContext;
import org.jboss.util.CachePolicy;
/**
* This is a JMX service which manages JAAS based SecurityManagers.
* JAAS SecurityManagers are responsible for validating credentials
- * associated with principals. The service defaults to the
+ * associated with principals. The service defaults to the
* org.jboss.security.plugins.JaasSecurityManager implementation but
* this can be changed via the securityManagerClass property.
- *
+ *
* @see JaasSecurityManager
* @see SubjectSecurityManager
* @author <a href="[EMAIL PROTECTED]">Oleg Nitz</a>
@@ -52,213 +58,244 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Scott Stark</a>
*/
public class JaasSecurityManagerService
- extends ServiceMBeanSupport
- implements JaasSecurityManagerServiceMBean
+extends ServiceMBeanSupport
+implements JaasSecurityManagerServiceMBean
{
- /** The class that provides the security manager implementation */
- private static String securityMgrClassName;
- /** The loaded securityMgrClassName */
- private static Class securityMgrClass;
- /** The security credential cache policy, shared by all security mgrs */
- private static CachePolicy cachePolicy;
- private static String cacheJndiName;
- /** The class that provides the SecurityProxyFactory implementation */
- private static String securityProxyFactoryClassName;
- private static Class securityProxyFactoryClass;
-
- static NamingServer srv;
- static Hashtable jsmMap = new Hashtable();
-
- public JaasSecurityManagerService()
- {
- // use thread-local principal and credential propagation
- SecurityAssociation.setServer();
- try
- { // Use JaasSecurityManager as the default
-
setSecurityManagerClassName("org.jboss.security.plugins.JaasSecurityManager");
- // Use SubjectSecurityProxyFactory as the default SecurityProxyFactory
-
setSecurityProxyFactoryClassName("org.jboss.security.SubjectSecurityProxyFactory");
- }
- catch(ClassNotFoundException e)
- {
- }
- }
-
- public String getSecurityManagerClassName()
- {
- return securityMgrClassName;
- }
- public void setSecurityManagerClassName(String className)
- throws ClassNotFoundException
- {
- securityMgrClassName = className;
- ClassLoader loader = Thread.currentThread().getContextClassLoader();
- securityMgrClass = loader.loadClass(securityMgrClassName);
- }
- public String getSecurityProxyFactoryClassName()
- {
- return securityProxyFactoryClassName;
- }
- public void setSecurityProxyFactoryClassName(String className)
- throws ClassNotFoundException
- {
- securityProxyFactoryClassName = className;
- ClassLoader loader = Thread.currentThread().getContextClassLoader();
- securityProxyFactoryClass = loader.loadClass(securityProxyFactoryClassName);
- }
+ /** The class that provides the security manager implementation */
+ private static String securityMgrClassName =
"org.jboss.security.plugins.JaasSecurityManager";
+ /** The loaded securityMgrClassName */
+ private static Class securityMgrClass;
+ /** The security credential cache policy, shared by all security mgrs */
+ private static CachePolicy cachePolicy;
+ private static String cacheJndiName;
+ /** The class that provides the SecurityProxyFactory implementation */
+ private static String securityProxyFactoryClassName =
"org.jboss.security.SubjectSecurityProxyFactory";
+ private static Class securityProxyFactoryClass =
org.jboss.security.SubjectSecurityProxyFactory.class;
+
+ private static Hashtable jsmMap = new Hashtable();
+ private static NameParser parser;
+
+ static
+ {
+ // use thread-local principal and credential propagation
+ SecurityAssociation.setServer();
+ }
+
+ /** The constructor does nothing as the security manager is created
+ on each lookup into java:/jaas/xxx. This is also why all variables
+ in this class are static.
+ */
+ public JaasSecurityManagerService()
+ {
+ }
+
+ public String getSecurityManagerClassName()
+ {
+ return securityMgrClassName;
+ }
+ public void setSecurityManagerClassName(String className)
+ throws ClassNotFoundException
+ {
+ securityMgrClassName = className;
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ securityMgrClass = loader.loadClass(securityMgrClassName);
+ }
+ public String getSecurityProxyFactoryClassName()
+ {
+ return securityProxyFactoryClassName;
+ }
+ public void setSecurityProxyFactoryClassName(String className)
+ throws ClassNotFoundException
+ {
+ securityProxyFactoryClassName = className;
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ securityProxyFactoryClass = loader.loadClass(securityProxyFactoryClassName);
+ }
/** Get the jndi name under which the authentication cache policy is found
*/
- public String getAuthenticationCacheJndiName()
- {
- return cacheJndiName;
- }
+ public String getAuthenticationCacheJndiName()
+ {
+ return cacheJndiName;
+ }
/** Set the jndi name under which the authentication cache policy is found
*/
- public void setAuthenticationCacheJndiName(String jndiName)
- {
- this.cacheJndiName = jndiName;
- }
-
- public String getName()
- {
- return "JAAS Security Manager";
- }
-
+ public void setAuthenticationCacheJndiName(String jndiName)
+ {
+ this.cacheJndiName = jndiName;
+ }
+
+ public String getName()
+ {
+ return "JAAS Security Manager";
+ }
+
protected ObjectName getObjectName(MBeanServer server, ObjectName name)
- throws javax.management.MalformedObjectNameException
+ throws javax.management.MalformedObjectNameException
{
return new ObjectName(OBJECT_NAME);
}
-
- protected void startService() throws Exception
- {
- srv = new NamingServer();
-
- InitialContext ic = new InitialContext();
-
- // Bind reference to SM subcontext in JNDI
- // Uses JNDI federation to handle the "java:/jaas" context ourselves
- RefAddr refAddr = new StringRefAddr("nns", "JSM");
- String factoryName = SecurityDomainObjectFactory.class.getName();
- Reference jsmsRef = new Reference("javax.naming.Context", refAddr,
factoryName, null);
- Context ctx = new InitialContext();
- ctx.rebind("java:/jaas", jsmsRef);
-
- try
- {
- if( cacheJndiName != null )
- cachePolicy = (CachePolicy) ctx.lookup(cacheJndiName);
- }
- catch(NamingException e)
- {
- }
- System.out.println("JAAS.startService, cachePolicy="+cachePolicy);
- // Bind the default SecurityProxyFactory instance under
java:/SecurityProxyFactory
- SecurityProxyFactory proxyFactory = (SecurityProxyFactory)
securityProxyFactoryClass.newInstance();
- ctx.bind("java:/SecurityProxyFactory", proxyFactory);
- System.out.println("JAAS.startService, SecurityProxyFactory="+proxyFactory);
- }
-
- protected void stopService()
- {
- InitialContext ic;
- try
- {
- ic = new InitialContext();
- ic.unbind("java:/jaas");
- }
- catch (CommunicationException e)
- {
- // Do nothing, the naming services is already stopped
- }
- catch (Exception e)
- {
- log.exception(e);
- }
- }
-
+
+ protected void startService() throws Exception
+ {
+ InitialContext ic = new InitialContext();
+
+ // Bind reference to SM subcontext in JNDI
+ // Uses JNDI federation to handle the "java:/jaas" context ourselves
+ RefAddr refAddr = new StringRefAddr("nns", "JSM");
+ String factoryName = SecurityDomainObjectFactory.class.getName();
+ Reference jsmsRef = new Reference("javax.naming.Context", refAddr,
factoryName, null);
+ Context ctx = new InitialContext();
+ ctx.rebind("java:/jaas", jsmsRef);
+ parser = ctx.getNameParser("");
+
+ try
+ {
+ if( cacheJndiName != null )
+ cachePolicy = (CachePolicy) ctx.lookup(cacheJndiName);
+ }
+ catch(NamingException e)
+ {
+ }
+ System.out.println("JAAS.startService, cachePolicy="+cachePolicy);
+ // Bind the default SecurityProxyFactory instance under
java:/SecurityProxyFactory
+ SecurityProxyFactory proxyFactory = (SecurityProxyFactory)
securityProxyFactoryClass.newInstance();
+ ctx.bind("java:/SecurityProxyFactory", proxyFactory);
+ System.out.println("JAAS.startService, SecurityProxyFactory="+proxyFactory);
+ }
+
+ protected void stopService()
+ {
+ InitialContext ic;
+ try
+ {
+ ic = new InitialContext();
+ ic.unbind("java:/jaas");
+ }
+ catch (CommunicationException e)
+ {
+ // Do nothing, the naming services is already stopped
+ }
+ catch (Exception e)
+ {
+ log.exception(e);
+ }
+ }
+
// ObjectFactory implementation ----------------------------------
-
- public static class SecurityDomainObjectFactory implements ObjectFactory
- {
- /**
- * Object factory implementation. This method is a bit tricky as it is called
twice for each
- * JSM lookup. Let's say the lookup is for "java:jaas/MySecurity". Then this
will first be
- * called as JNDI starts the "jaas" federation. In that call we make sure that
the next call
- * will go through, i.e. we check that the "MySecurity" binding is availble.
Then we return
- * the implementation of the "jaas" context. Then, when the "MySecurity" is
dereferenced we
- * look up the JSM from an internal static hash table.
- *
- * Note: it is possible to break this by doing the lookup in two phases: first
lookup "java:jaas"
- * and then do a second lookup of "MySecurity". If that is done then the first
lookup has no way of
- * knowing what name to check (i.e. it can't make sure that "MySecurity" is
available in the
- * "java:jaas" context!
- *
- * @param obj
- * @param name
- * @param nameCtx
- * @param environment
- * @return
- * @exception Exception
- */
- public Object getObjectInstance(Object obj, Name name, Context nameCtx,
Hashtable environment)
- throws Exception
- {
- if (name != null)
- {
- // Handle securityManager lookup
- if (name.size() == 0)
- return nameCtx;
- return jsmMap.get(name);
- }
- else
- {
- // Handle "java:jaas" context
- CannotProceedException cpe =
(CannotProceedException)environment.get(NamingManager.CPE);
- Name remainingName = cpe.getRemainingName();
-
- Context ctx = new NamingContext(environment, null, srv);
- // Make sure that JSM is available
+
+ public static class SecurityDomainObjectFactory implements InvocationHandler,
ObjectFactory
+ {
+ /** Object factory implementation. This method returns a Context proxy
+ that is only able to handle a lookup operation for an atomic name of
+ a security domain.
+ */
+ public Object getObjectInstance(Object obj, Name name, Context nameCtx,
Hashtable environment)
+ throws Exception
+ {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ Class[] interfaces = {Context.class};
+ Context ctx = (Context) Proxy.newProxyInstance(loader, interfaces, this);
+ return ctx;
+ }
+
+ private Object newSecurityMgr(String securityDomain) throws NamingException
+ {
+ Object securityMgr = null;
+ try
+ { // Create instance of securityMgrClass
+ Class[] parameterTypes = {String.class};
+ Constructor ctor = securityMgrClass.getConstructor(parameterTypes);
+ Object[] args = {securityDomain};
+ securityMgr = ctor.newInstance(args);
+ System.out.println("JAAS.Created securityMgr="+securityMgr);
+ // See if the security mgr supports an externalized cache policy
try
{
- srv.lookup(remainingName);
+ parameterTypes[0] = CachePolicy.class;
+ Method m = securityMgrClass.getMethod("setCachePolicy",
parameterTypes);
+ args[0] = cachePolicy;
+ System.out.println("JAAS.setCachePolicy, c="+args[0]);
+ m.invoke(securityMgr, args);
}
- catch(Exception e)
+ catch(Exception e2)
+ { // No cache policy support, this is ok
+ }
+ System.out.println("JAAS.Added "+securityDomain+", "+securityMgr+" to
map");
+ jsmMap.put(securityDomain, securityMgr);
+ }
+ catch(Exception e2)
+ {
+ e2.printStackTrace();
+ throw new NamingException("Failed to create sec mgr:"+e2.getMessage());
+ }
+ return securityMgr;
+ }
+
+ public Object invoke(Object obj, Method method, Object[] args) throws
Throwable
+ {
+ String methodName = method.getName();
+ if( methodName.equals("toString") == true )
+ return "java:/jaas Context proxy";
+ if( methodName.equals("list") == true )
+ return new DomainEnumeration(jsmMap.keys());
+
+ if( methodName.equals("lookup") == false )
+ throw new OperationNotSupportedException("Only lookup is supported,
op="+method);
+ String securityDomain = null;
+ Name name = null;
+ if( args[0] instanceof String )
+ name = parser.parse((String) args[0]);
+ else
+ name = (Name)args[0];
+ securityDomain = name.get(0);
+ Object binding = jsmMap.get(securityDomain);
+ if( binding == null )
+ {
+ binding = newSecurityMgr(securityDomain);
+ jsmMap.put(securityDomain, binding);
+ }
+ // Look for requests against the security manager
+ if( name.size() == 2 )
+ {
+ String request = name.get(1);
+ if( binding instanceof SubjectSecurityManager &&
request.equals("subject") )
{
- // Not found - add reference to JNDI, and a real security mgr to a
map
- Reference jsmRef = new Reference(securityMgrClass.getName(),
getClass().getName(), null);
- ctx.rebind(remainingName, jsmRef);
- String securityDomain = remainingName.toString();
- try
- { // Create instance of securityMgrClass
- Class[] parameterTypes = {String.class};
- Constructor ctor =
securityMgrClass.getConstructor(parameterTypes);
- Object[] args = {securityDomain};
- Object securityMgr = ctor.newInstance(args);
-System.out.println("JAAS.Created securityMgr="+securityMgr);
- // See if the security mgr supports an externalized cache policy
- try
- {
- parameterTypes[0] = CachePolicy.class;
- Method m = securityMgrClass.getMethod("setCachePolicy",
parameterTypes);
- args[0] = cachePolicy;
-System.out.println("JAAS.setCachePolicy, c="+args[0]);
- m.invoke(securityMgr, args);
- }
- catch(Exception e2)
- { // No cache policy support, this is ok
- }
-System.out.println("JAAS.Added "+remainingName+", "+securityMgr+" to map");
- jsmMap.put(remainingName, securityMgr);
- }
- catch(Exception e2)
- {
-e2.printStackTrace();
- throw e2;
- }
+ SubjectSecurityManager ssm = (SubjectSecurityManager) binding;
+ Subject subject = ssm.getActiveSubject();
+ binding = subject;
}
- return ctx;
- }
- }
- }
+ }
+ return binding;
+ }
+ }
+ static class DomainEnumeration implements NamingEnumeration
+ {
+ Enumeration domains;
+ DomainEnumeration(Enumeration domains)
+ {
+ this.domains = domains;
+ }
+
+ public void close()
+ {
+ }
+ public boolean hasMoreElements()
+ {
+ return domains.hasMoreElements();
+ }
+ public boolean hasMore()
+ {
+ return domains.hasMoreElements();
+ }
+ public Object next()
+ {
+ String name = (String) domains.nextElement();
+ NameClassPair pair = new NameClassPair(name, securityMgrClassName);
+ return pair;
+ }
+ public Object nextElement()
+ {
+ return domains.nextElement();
+ }
+ }
}
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-development