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:
- Para WebContainer:
En el archivo
server.xml, debe establecerse el siguiente elemento:
<webContainer deferServletLoad="false"/>
- 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
- 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) {}
}
- Empaquete el componente en un paquete OSGi que forme parte de la característica de
usuario, junto con el proveedor JACC.
- 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/".
- 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>