Desarrollo de un proveedor de autorización JAAC (Java Authorization Contract for Containers)

Puede desarrollar un proveedor JACC para disponer de las aplicaciones de decisiones de autorización personalizadas para Java™™ Platform, Enterprise Edition (J2EE) implementando la interfaz com.ibm.wsspi.security.authorization.jacc.ProviderService que se proporciona en el servidor de Liberty.

Antes de empezar

De forma predeterminada, la carga del módulo de aplicación se difiere hasta que se esté procesando la solicitud en la aplicación. Sin embargo, la restricción de seguridad del módulo completo en la aplicación debe procesarse antes de que la aplicación esté lista para su proceso. La carga del módulo diferida debe inhabilitarse. A continuación, se muestra cómo inhabilitarla:
  1. Para WebContainer:
    En el archivo server.xml, debe establecerse el siguiente elemento:
    <webContainer deferServletLoad="false"/>
  2. Para EJBContainer:
    En el archivo server.xml, se debe establecer la propiedad siguiente:
    <ejbContainer startEJBsAtAppStart="true"/>
    Nota: Si no se han establecido los elementos anteriores, es posible que no se propague toda la información de restricción de seguridad en el proveedor JACC de terceros tras el inicio del servidor. Como resultado, puede que no se aplique la decisión de autorización correcta por parte del proveedor JACC de terceros.

Acerca de esta tarea

La especificación Java Authorization Contract for Containers, JSR 115, define una interfaz para los proveedores de autorización. En el servidor de Liberty, debe empaquetar el proveedor JACC como una característica de usuario. La característica debe implementar la interfaz com.ibm.wsspi.security.authorization.jacc.ProviderService.

Procedimiento

  1. Cree un componente OSGi que proporcione un servicio que implemente la interfaz com.ibm.wsspi.security.authorization.jacc.ProviderService.

    La interfaz ProviderService define dos métodos. El método getPolicy, que invoca el tiempo de ejecución de Liberty para recuperar una instancia de la clase Policy que implementa la clase abstracta java.security.Policy. Además, el método getPolicyConfigFactory, que invoca el tiempo de ejecución de Liberty para recuperar una instancia de la clase PolicyConfigurationFactory que implementa la clase abstracta javax.security.jacc.PolicyConfigurationFactory.

    En el ejemplo siguiente, se utilizan anotaciones de servicios declarativos de OSGi:
    package com.mycompany.jacc;
    
    import com.mycompany.jacc.MyAuthConfigProvider;
    import com.ibm.wsspi.security.authorization.jacc.ProviderService;
    import java.security.Policy;
    import java.util.Map;
    import javax.security.jacc.PolicyConfigurationFactory;
    import org.osgi.service.component.ComponentContext;
    import org.osgi.service.component.annotations.Activate;
    import org.osgi.service.component.annotations.Component;
    import org.osgi.service.component.annotations.Deactivate;
    
    // El valor de propiedad de javax.security.jacc.policy.provider, que define la clase de implementación de Policy, y de
    // javax.security.jacc.PolicyConfigurationFactory.provider, que define la clase de implementación de PolicyConfigurationFactory, son necesarios para propagar las propiedades al tiempo de ejecución de Liberty.
    
    @Component(service = ProviderService.class,
      immediate = true,
      property = {
        "javax.security.jacc.policy.provider=com.myco.jacc.MyPolicy",
        "javax.security.jacc.PolicyConfigurationFactory.provider="
        + "com.myco.jacc.MyFactoryImpl"
      }
    )
    
    public class MyJaccProviderService implements ProviderService {
        Map<String, String> configProps;
    
        // Este método invocado por el tiempo de ejecución de Liberty
        // para obtener una instancia de la clase Policy
        @Override
        public Policy getPolicy() {
            return new myPolicy();
        }
    
        // Este método invocado por el tiempo de ejecución de Liberty
        // para obtener una instancia de la clase PolicyConfigurationFactory
        @Override
        public PolicyConfigurationFactory getPolicyConfigurationFactory() {
            ClassLoader cl = null;
            PolicyConfigurationFactory pcf = null;
            System.setProperty(
              "javax.security.jacc.PolicyConfigurationFactory.provider",
              "com.myco.jacc.MyFactoryImpl");
            try {
                cl = Thread.currentThread().getContextClassLoader();
                Thread.currentThread().setContextClassLoader(
                                  this.getClass().getClassLoader());
                pcf = PolicyConfigurationFactory.getPolicyConfigurationFactory();
            } catch (Exception e) {
                return null;
            } finally {
                Thread.currentThread().setContextClassLoader(cl);
            }
            return pcf;
        }
    
        @Activate
        protected void activate(ComponentContext cc) {
            // Lea aquí las propiedades de configuración del proveedor, si es necesario,
            // y páselas al ctor de Provider.
            // Este ejemplo lee las propiedades de
            // la definición del componente OSGi.
            configProps = (Map<String, String>) cc.getProperties();
        }
    
        @Deactivate
        protected void deactivate(ComponentContext cc) {}
    }
  2. Empaquete el componente en un paquete OSGi que forme parte de la característica de usuario, junto con el proveedor JACC.
  3. Asegúrese de que la característica incluya el contenido del subsistema OSGi: com.ibm.ws.javaee.jacc.1.5; version="[1,1.0.100)"; location:="dev/api/spec/".
  4. Una vez instalada la característica en la ubicación de la extensión del producto de usuario, configure el archivo server.xml con el nombre de la característica. Por ejemplo:
    <featureManager>
       ...
       <feature>usr:myJaccProvider</feature>
    </featureManager>

Icono que indica el tipo de tema Tema de tarea

Nombre de archivo: twlp_developing_jacc_auth_provider.html