È possibile sviluppare un provider JACC per avere decisioni di autorizzazione personalizzate per le applicazioni Java™ Platform, Enterprise Edition (J2EE) implementando l'interfaccia com.ibm.wsspi.security.authorization.jacc.ProviderService fornita nel server Liberty .
Prima di iniziare
Per default, il caricamento del modulo dell'applicazione viene rinviato fino a quando non viene elaborata la richiesta all'applicazione. Tuttavia, il vincolo di sicurezza dell'intero modulo nell'applicazione deve essere elaborato prima che l'applicazione sia pronta per essere elaborata. Il caricamento del modulo rinviato deve essere disabilitato. Quanto segue mostra come disabilitarla:
- Per il WebContainer:
Nel file
server.xml , è necessario impostare il seguente elemento:
<webContainer deferServletLoad="false"/>
- Per EJBContainer:
Nel file
server.xml , è necessario impostare la seguente proprietà:
<ejbContainer startEJBsAtAppStart="true"/>
Nota: se gli elementi precedenti non sono impostati, le informazioni complete sui vincoli di sicurezza potrebbero non essere propagate al provider JACC di terze parti all'avvio del server. Di conseguenza, la decisione di autorizzazione corretta potrebbe non essere applicata dal fornitore JACC di terze parti.
Informazioni su questa attività
La specifica Java Authorization Contract for Containers, JSR 115, definisce un'interfaccia per provider di autorizzazione. Nel server Liberty , è necessario impacchettare il provider JACC come funzione utente. La funzione deve implementare l'interfaccia com.ibm.wsspi.security.authorization.jacc.ProviderService .
Procedura
- Crea un componente OSGi che fornisce un servizio che implementa l'interfaccia
com.ibm.wsspi.security.authorization.jacc.ProviderService .
L'interfaccia ProviderService definisce due metodi. Il metodo getPolicy , che il runtime di Liberty richiama per recuperare un'istanza della tua classe di politica che implementa la classe astrattajava.security.Policy . Inoltre, il metodo getPolicyConfigFactory , che il runtime Liberty richiama per recuperare un'istanza della propria classe PolicyConfigurationFactory che implementa la classe astratta javax.security.jacc.PolicyConfigurationFactory .
Il seguente esempio utilizza le annotazioni dei servizi dichiarativi 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;
// The property value of javax.security.jacc.policy.provider which defines the implementation class of Policy and
// javax.security.jacc.PolicyConfigurationFactory.provider which defines the implementation class of PolicyConfigurationFactory, are required for propagating the properties to the Liberty runtime.
@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;
// This method called by the Liberty runtime
// to get an instance of Policy class
@Override
public Policy getPolicy() {
return new myPolicy();
}
// This method called by the Liberty runtime
// to get an instance of PolicyConfigurationFactory class
@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) {
// Read provider config properties here if needed,
// then pass them to the Provider ctor.
// This example reads the properties from the OSGi
// component definition.
configProps = (Map<String, String>) cc.getProperties();
}
@Deactivate
protected void deactivate(ComponentContext cc) {}
}
- Pacchetto del componente in un bundle OSGi che fa parte della funzione utente, insieme al provider JACC.
- Verificare che la funzione includa il contenuto del sottosistema OSGi:
com.ibm.ws.javaee.jacc.1.5; version="[1,1.0.100)"; location:="dev/api/spec/".
- Dopo aver installato la funzione nell'ubicazione dell'estensione del prodotto dell'utente, configurare il file server.xml con il nome della funzione. Ad esempio:
<featureManager>
...
<feature>usr:myJaccProvider</feature>
</featureManager>