User: starksm
Date: 01/04/10 18:54:46
Added: src/main/org/jboss/security/plugins
JaasSecurityManagerService.java
JaasSecurityManagerServiceMBean.java
Log:
Moved the JaasSecurityManager MBean to the JBossSX package
Revision Changes Path
1.1
jbosssx/src/main/org/jboss/security/plugins/JaasSecurityManagerService.java
Index: JaasSecurityManagerService.java
===================================================================
/*
* JBoss, the OpenSource EJB server
*
* 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.Method;
import java.net.URL;
import java.util.Hashtable;
import java.util.ArrayList;
import java.util.Iterator;
import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.Reference;
import javax.naming.RefAddr;
import javax.naming.StringRefAddr;
import javax.naming.Name;
import javax.naming.NamingException;
import javax.naming.spi.ObjectFactory;
import javax.naming.spi.NamingManager;
import javax.naming.CommunicationException;
import javax.naming.CannotProceedException;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.jboss.logging.Log;
import org.jboss.security.SecurityProxyFactory;
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
* 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>
* @author <a href="[EMAIL PROTECTED]">Rickard Oberg</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Scott Stark</a>
*/
public class JaasSecurityManagerService
extends ServiceMBeanSupport
implements JaasSecurityManagerServiceMBean, ObjectFactory
{
/** 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()
{
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);
}
/** Get the jndi name under which the authentication cache policy is found
*/
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";
}
protected ObjectName getObjectName(MBeanServer server, ObjectName name)
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");
Reference jsmsRef = new Reference("javax.naming.Context",
refAddr,getClass().getName(), 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);
}
}
// ObjectFactory implementation ----------------------------------
/**
* 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
try
{
srv.lookup(remainingName);
}
catch(Exception e)
{
// 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();
log.exception(e2);
throw e2;
}
}
return ctx;
}
}
}
1.1
jbosssx/src/main/org/jboss/security/plugins/JaasSecurityManagerServiceMBean.java
Index: JaasSecurityManagerServiceMBean.java
===================================================================
/*
* JBoss, the OpenSource EJB server
*
* Distributable under LGPL license.
* See terms of license at gnu.org.
*/
package org.jboss.security.plugins;
/** The interface for the JaasSecurityManagerService mbean.
*/
public interface JaasSecurityManagerServiceMBean
extends org.jboss.util.ServiceMBean
{
// Constants -----------------------------------------------------
public static final String OBJECT_NAME = ":service=JaasSecurityManager";
// Public --------------------------------------------------------
/** Get the name of the class that provides the security manager implementation.
*/
public String getSecurityManagerClassName();
/** Set the name of the class that provides the security manager implementation.
*/
public void setSecurityManagerClassName(String className) throws
ClassNotFoundException;
/** Get the name of the class that provides the SecurityProxyFactory
implementation.
*/
public String getSecurityProxyFactoryClassName();
/** Set the name of the class that provides the SecurityProxyFactory
implementation.
*/
public void setSecurityProxyFactoryClassName(String className) throws
ClassNotFoundException;
/** Get the jndi name under which the authentication CachePolicy implenentation
is found
*/
public String getAuthenticationCacheJndiName();
/** Set the jndi name under which the authentication CachePolicy implenentation
is found
*/
public void setAuthenticationCacheJndiName(String jndiName);
}
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-development