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 perfil
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, debe establecerse el siguiente elemento:
<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 perfiles 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: getPolicy, que el tiempo de ejecución del perfil Liberty invoca para recuperar una instancia de la clase de política que implementa la clase abstracta java.security.Policy; y getPolicyConfigFactory, que el tiempo de ejecución del perfil Liberty invoca para recuperar una instancia de su 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;
// 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.mycompany.jacc.MyPolicy",
"javax.security.jacc.PolicyConfigurationFactory.provider
=com.mycompany.jacc.MyPolicyConfigurationFactoryImpl"
}
)
public class MyJaccProviderService implements ProviderService {
// El tiempo de ejecución del perfil Liberty invoca este método
// para obtener una instancia de la clase Policy
@Override
public Policy getPolicy() {
return new myPolicy();
}
// El tiempo de ejecución del perfil Liberty invoca este método
// para obtener una instancia de la clase PolicyConfigurationFactory
@Override
public Policy getPolicyConfigurationFactory() {
ClassLoader cl = null;
PolicyConfigurationFactory pcf = null;
System.setProperty(JACC_FACTORY, JACC_FACTORY_IMPL);
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;
}
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 = (MapString, String) cc.getProperties();
}
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; ubicación:="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>