JACC-Provider (Java Authorization Contract for Containers) entwickeln

Sie können einen JACC-Provider entwickeln, um angepasste Berechtigungsentscheidungen für J2EE-Anwendungen (Java™ Platform, Enterprise Edition) zu treffen, indem Sie die mit dem Liberty-Server bereitgestellte Schnittstelle com.ibm.wsspi.security.authorization.jacc.ProviderService implementieren.

Vorbereitende Schritte

Standardmäßig wird das Laden des Anwendungsmoduls verzögert, bis die an die Anwendung gerichtete Anforderung verarbeitet wird, allerdings muss, bevor die Anwendung zur Verarbeitung bereit ist, die Integritätsbedingung für die Sicherheit des gesamten Moduls verarbeitet werden. Das verzögerte Modul muss inaktiviert werden. Gehen Sie wie folgt vor, um das Modul zu inaktivieren:
  1. Für den Web-Container:
    In der Datei server.xml muss das folgende Element festgelegt werden:
    <webContainer deferServletLoad="false"/>
  2. Für den EJB-Container:
    In der Datei server.xml muss die folgende Eigenschaft definiert werden:
    <ejbContainer startEJBsAtAppStart="true"/>
    Anmerkung: Wenn die vorherigen Elemente nicht festgelegt wurden, werden sämtliche Informationen der Integritätsbedingung für die Sicherheit beim Start des Servers möglicherweise nicht an den JACC-Provider eines Drittanbieters weitergegeben. Folglich ist es möglich, dass der JACC-Provider eines Drittanbieters nicht die richtige Berechtigungsentscheidung durchsetzt.

Informationen zu diesem Vorgang

Die JSR 115 (Java Specification Request) für die Spezifikation "Java Authorization Contract for Containers" definiert eine Schnittstelle für Berechtigungsprovider. Im Liberty-Server müssen Sie Ihren JACC-Provider als Benutzerfeature packen. Ihr Feature muss die Schnittstelle com.ibm.wsspi.security.authorization.jacc.ProviderService implementieren.

Vorgehensweise

  1. Erstellen Sie eine OSGi-Komponente, die einen Service bereitstellt, der die Schnittstelle com.ibm.wsspi.security.authorization.jacc.ProviderService implementiert.

    Die Schnittstelle ProviderService definiert zwei Methoden. Die Methode getPolicy, die von der Liberty-Laufzeit aufgerufen wird, um eine Instanz Ihrer Providerklasse abzurufen, die die abstrakte Klasse java.security.Policy implementiert, sowie die Methode getPolicyConfigFactory, die von der Liberty-Laufzeit aufgerufen wird, um eine Instanz Ihrer PolicyConfigurationFactory-Klasse abzurufen, die die abstrakte Klasse javax.security.jacc.PolicyConfigurationFactory implementiert.

    Im folgenden Beispiel werden Annotationen für OSGi Declarative Services verwendet:
    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;
    
    // Der Eigenschaftswert von javax.security.jacc.policy.provider, der die Implementierungsklasse von Policy und
    // javax.security.jacc.PolicyConfigurationFactory.provider definiert, die wiederum die Implementierungsklasse von
    // PolicyConfigurationFactory definiert, sind für die Weitergabe der Eigenschaften an die Liberty-Laufzeit erforderlich.
    
    @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;
    
        // Diese Methode wird von der Liberty-Laufzeitumgebung aufgerufen,
        // um eine Instanz der Klasse "Policy" abzurufen
        @Override
        public Policy getPolicy() {
            return new myPolicy();
        }
    
        // Diese Methode wird von der Liberty-Laufzeitumgebung aufgerufen,
        // um eine Instanz der Klasse "PolicyConfigurationFactory" abzurufen
        @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) {
            // Die Konfigurationseigenschaften des Providers können bei Bedarf hier gelesen
            // und dann an die AuthConfigProvider-Factory übergeben werden.
            // In diesem Beispiel werden die Eigenschaften aus der
            // OSGi-Komponentendefinition gelesen.
            configProps = (Map<String, String>) cc.getProperties();
        }
    
        @Deactivate
        protected void deactivate(ComponentContext cc) {}
    }
  2. Packen Sie die Komponente zusammen mit Ihrem JACC-Provider in ein OSGi-Bundle, das Teil Ihres Benutzerfeatures ist.
  3. Vergewissern Sie sich, dass Ihr Feature den Inhalt des OSGi-Subsystems einschließt: com.ibm.ws.javaee.jacc.1.5; version="[1,1.0.100)"; location:="dev/api/spec/".
  4. Nachdem das Feature im Verzeichnis der benutzerspezifischen Produkterweiterung installiert ist, konfigurieren Sie die Datei server.xml mit dem Featurenamen. Beispiel:
    <featureManager> 
       ...
       <feature>usr:myJaccProvider</feature>
    </featureManager>

Symbol das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 01.12.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-libcore-mp&topic=twlp_developing_jacc_auth_provider
Dateiname: twlp_developing_jacc_auth_provider.html