Hi

Sure, here it is:

foo.ear
  datasource.sar
  security.sar
  foo.war
  foo.jar

where security.sar looks like:

  security.sar
    Meta-inf
      Manifest
      jboss-service.xml
      login-config.xml

where jboss-service.xml contains:

<server>
   <mbean code="com.acme.mbean.security.SecurityConfig"
name="acme:service=AcmeSecurityLoginConfig">
      <attribute name="AuthConfig">META-INF/login-config.xml</attribute>
      <attribute
name="SecurityConfigName">jboss.security:name=SecurityConfig</attribute>
   </mbean>
</server>

and login-config.xml contains:

<policy>
    <application-policy name = "AcmeRealm">
      <authentication>
        <login-module code =
"org.jboss.security.auth.spi.DatabaseServerLoginModule" flag = "required">
          <module-option name = "dsJndiName">java:/AcmeDS</module-option>
          <module-option name = "principalsQuery">sql select password
string</module-option>
          <module-option name = "rolesQuery">sql select role
string</module-option>
        </login-module>
      </authentication>
    </application-policy>
</policy>

and finally the source for the mbean com.acme.mbean.security.SecurityConfig

This the implementation: SecurityConfig.java

package com.acme.mbean.security;

import java.net.URL;
import java.util.Hashtable;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.jboss.security.auth.login.XMLLoginConfig;
import org.jboss.system.ServiceMBeanSupport;

/**
 * A security config mbean that loads an xml login configuration and
 * pushes a XMLLoginConfig instance onto the the config stack managed by
 * the SecurityConfigName mbean(default=jboss.security:name=SecurityConfig).
 *
 **/
public class SecurityConfig extends ServiceMBeanSupport
   implements com.netmill.dmmbase.mbean.security.SecurityConfigMBean
{
   // Constants -----------------------------------------------------

   // Attributes ----------------------------------------------------
   private String authConf = "login-config.xml";
   private XMLLoginConfig config = null;
   private ObjectName mainSecurityConfig;

   // Static --------------------------------------------------------

   // Constructors --------------------------------------------------
   public SecurityConfig()
   {
      setSecurityConfigName("jboss.security:name=SecurityConfig");
   }

   // Public --------------------------------------------------------
   /**
    * Get the name
    **/
   public String getName()
   {
      return "JAAS Login Config";
   }

   /**
    * Get securityConfigName
    **/
   public String getSecurityConfigName()
   {
      return mainSecurityConfig.toString();
   }

   /**
    * Set securityConfigName
    **/
   public void setSecurityConfigName(String objectName)
   {
      try
      {
         mainSecurityConfig = new ObjectName(objectName);
      }
      catch(Exception e)
      {
         log.error("Failed to create ObjectName", e);
      }
   }

   /**
    * Get the resource path to the JAAS login configuration file to use.
    **/
   public String getAuthConfig()
   {
      return authConf;
   }

   /**
    * Set the resource path to the JAAS login configuration file to use.
    * The default is "login-config.xml".
    **/
   public void setAuthConfig(String authConf)
   {
      this.authConf = authConf;
   }

   // Protected --------------------------------------------------------
   /**
    * Start the service.
    **/
   protected void startService() throws Exception
   {
      // Look for the authConf as resource
      ClassLoader loader = Thread.currentThread().getContextClassLoader();
      URL loginConfig = loader.getResource(authConf);
      if( loginConfig != null )
      {
         String securityConfigName = "AcmeConfig";
         log.info("Using securityConfigName: '"+securityConfigName+"'");
         log.info("Using JAAS AuthConfig: "+loginConfig.toExternalForm());
         config = new XMLLoginConfig();
         config.setConfigURL(loginConfig);
         config.start();
         MBeanServer server = super.getServer();
         ObjectName name = super.getServiceName();
         Hashtable props = name.getKeyPropertyList();
         props.put(securityConfigName, "XMLLoginConfig");
         name = new ObjectName(name.getDomain(), props);
         server.registerMBean(config, name);
         Object[] args = {name.toString()};
         String[] sig = {String.class.getName()};
         server.invoke(mainSecurityConfig, "pushLoginConfig", args, sig);
      }
      else
      {
         log.warn("No AuthConfig resource found");
      }
   }

   /**
    * Stop the service.
    **/
   protected void stopService() throws Exception
   {
      String securityConfigName = "AcmeConfig";
      log.info("Using securityConfigName: '"+securityConfigName+"'");
      MBeanServer server = super.getServer();
      ObjectName name = super.getServiceName();
      Hashtable props = name.getKeyPropertyList();
      props.put(securityConfigName, "XMLLoginConfig");
      name = new ObjectName(name.getDomain(), props);
      Object[] args = {};
      String[] sig = {};
      server.invoke(mainSecurityConfig, "popLoginConfig", args, sig);
      server.unregisterMBean(name);
   }
}

and the interface: SecurityConfigMBean.java

package com.acme.mbean.security;

import org.jboss.system.ServiceMBean;

/**
 * An mbean interface for a config service that pushes an xml based
 * javax.security.auth.login.Configuration onto the config stack managed by
 * the mbean whose name is given by the SecurityConfigName attribute.
 *
 **/
public interface SecurityConfigMBean extends ServiceMBean
{
   /**
    * Get the classpath resource name of the security configuration file
    **/
   public String getAuthConfig();

   /**
    * Set the classpath resource name of the security configuration file
    **/
   public void setAuthConfig(String configURL);

   /**
    * Get the name of the SecurityConfig mbean whose pushLoginConfig and
    * popLoginConfig ops will be used to install and remove the xml login
config
    **/
   public String getSecurityConfigName();

   /**
    * Set the name of the SecurityConfig mbean whose pushLoginConfig and
    * popLoginConfig ops will be used to install and remove the xml login
config
    **/
   public void setSecurityConfigName(String objectName);
}

The above will work for jBoss 3.0.x if you are using 3.20RC2 you have to
change the line :

      <attribute
name="SecurityConfigName">jboss.security:name=SecurityConfig</attribute>

in jboss-service.xml, to :

      <attribute
name="SecurityConfigName">jboss.security:service=SecurityConfig</attribute>

Thats it....

BR
Terp








-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
JBoss-user mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-user

Reply via email to