Développement d'un fournisseur d'authentification JASPI personnalisé

Vous pouvez développer un fournisseur d'authentification JASPI (Java™ Authentication SPI for Containers) personnalisé en créant des classes qui implémentent les interfaces requises répertoriées dans la spécification JSR 196: Java Authentication Service Provider Interface for Containers.

Avant de commencer

Vérifiez les exigences d'implémentation d'interface spécifiques des modules et fournisseurs d'authentification JASPI dans la spécification JSR 196: Java Authentication Service Provider Interface for Containers.

Pourquoi et quand exécuter cette tâche

WebSphere Application Server supports the use of third-party authentication providers that are compliant with the servlet container profile specified in Java Authentication SPI for Containers (JASPI) Version 1.1.

Le profil de conteneur de servlet définit les interfaces utilisées par l'environnement d'exécution de la sécurité conjointement avec le conteneur Web de WebSphere Application Server pour appeler les modules d'authentification avant et après le traitement d'une demande Web par une application. L'authentification à l'aide de modules JASPI n'est effectuée que si JASPI a été activé dans la configuration de la sécurité et qu'un fournisseur JASPI configuré a été associé au module Web qui traite la demande Web reçue.

Pour développer un fournisseur d'authentification personnalisé, créez des classes qui implémentent les interfaces requises répertoriées dans la spécification JSR 196: Java Authentication Service Provider Interface for Containers. Un fournisseur peut utiliser un ou plusieurs modules d'authentification pour l'authentification. Les modules peuvent utiliser des rappels pour effectuer l'authentification ou ajouter manuellement les informations d'ID utilisateur nécessaires au sujet du client. Suivant la portée du fournisseur, les classes d'implémentation peuvent être stockées dans divers emplacements sur le serveur d'applications.

Procédure

  1. Créez une classe qui implémente l'interface javax.security.auth.message.config.AuthConfigProvider.
    La classe d'implémentation AuthConfigProvider doit définir un constructeur public à deux arguments et la méthode publique getServerAuthConfig :
    import java.util.Map;
    import javax.security.auth.callback.CallbackHandler;
    import javax.security.auth.message.AuthException;
    import javax.security.auth.message.config.AuthConfigFactory;
    import javax.security.auth.message.config.AuthConfigProvider;
    import javax.security.auth.message.config.ServerAuthConfig;
    
    public class SampleAuthConfigProvider implements AuthConfigProvider {
    
            public SampleAuthConfigProvider(Map<String, String> properties, AuthConfigFactory factory) {
                    ...
            }
            public ServerAuthConfig getServerAuthConfig(String layer, String appContext, CallbackHandler handler)
                    throws AuthException {
                    ...
            }
    }

    Une instance de la classe d'implémentation AuthConfigProvider est utilisée par WebSphere Application Server lorsqu'une demande arrive pour être traitée par le module Web de l'application. La méthode getServerAuthConfig est utilisée pour obtenir une instance ServerAuthConfig. L'argument CallbackHandler de l'appel de méthode est utilisé par le ou les modules d'authentification.

  2. Créez une classe qui implémente l'interface javax.security.auth.message.config.ServerAuthConfig.
    La classe d'implémentation ServerAuthConfig doit définir les méthodes publiques getAuthContextID et getAuthContext :
    import java.util.Map;
    import javax.security.auth.Subject;
    import javax.security.auth.message.AuthException;
    import javax.security.auth.message.MessageInfo;
    import javax.security.auth.message.config.ServerAuthConfig;
    import javax.security.auth.message.config.ServerAuthContext;
    
    public class SampleServerAuthConfig implements ServerAuthConfig {
    
            public String getAuthContextID(MessageInfo messageInfo) throws IllegalArgumentException {
                    ...
            }
            public ServerAuthContext getAuthContext(String authContextID, Subject serviceSubject, Map properties) 
                    throws AuthException {
                    ...
            }
    }

    Les méthodes getAuthContextID et getAuthContext de la classe d'implémentation ServerAuthConfig permettent d'obtenir une instance ServerAuthContext.

  3. Créez une classe qui implémente l'interface javax.security.auth.message.config.ServerAuthContext.
    La classe d'implémentation ServerAuthContext doit définir les méthodes publiques validateRequest et secureResponse :
    import javax.security.auth.Subject;
    import javax.security.auth.message.AuthException;
    import javax.security.auth.message.AuthStatus;
    import javax.security.auth.message.MessageInfo;
    import javax.security.auth.message.config.ServerAuthContext;
    
    public class SampleServerAuthContext implements ServerAuthContext {
    
            public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject) 
                    throws AuthException {
                    ...
            }
            public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject) 
                    throws AuthException {
                    ...
            }
    }

    La méthode validateRequest de la classe d'implémentation ServerAuthContext permet d'appeler le module qui authentifie le message de demande Web reçu. Si l'authentification aboutit, le conteneur Web distribue le message de demande Web reçu que le module Web cible traite dans l'application. Si l'authentification échoue, la demande est rejetée avec le statut de réponse approprié.

  4. Créez une classe qui implémente l'interface javax.security.auth.message.module.ServerAuthModule.
    La classe d'implémentation ServerAuthModule doit définir les méthodes publiques initialize, validateRequest et secureResponse :
    import javax.security.auth.Subject;
    import javax.security.auth.callback.CallbackHandler;
    import javax.security.auth.message.AuthException;
    import javax.security.auth.message.AuthStatus;
    import javax.security.auth.message.MessageInfo;
    import javax.security.auth.message.MessagePolicy;
    import javax.security.auth.message.module.ServerAuthModule;
    
    public class SampleAuthModule implements ServerAuthModule {
    
            public void initialize(MessagePolicy requestPolicy, MessagePolicy responsePolicy, CallbackHandler handler, Map options) 
                    throws AuthException {
                    ...
            }
    
            public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject)
                    throws AuthException {
                    ...
            }
    
            public AuthStatus secureResponse(MessageInfo messageInfo, Subject serviceSubject) 
                    throws AuthException {
                    ...
            }
    }

    La méthode initialize de la classe d'implémentation ServerAuthModule est appelée par la classe d'implémentation ServerAuthContext pour initialiser le module d'authentification et l'associer à l'instance ServerAuthContext.

    Les méthodes validateRequest et secureResponse de cette classe permettent respectivement d'authentifier les interfaces javax.servlet.http.HttpServletRequest et javax.servlet.http.HttpServletResponse contenues dans l'objet javax.security.auth.message.MessageInfo reçu. Ces méthodes peuvent utiliser l'instance CallbackHandler reçues dans la méthode initialize afin d'interagir avec l'environnement d'exécution de la sécurité WebSphere pour valider un mot de passe utilisateur et le registre d'utilisateurs actif pour extraire un ID unique et des groupes d'appartenance pour un utilisateur. Les données extraites sont placées dans une table de hachage de l'ensemble des données d'identification privées dans le sujet du client. L'implémentation WebSphere Application Server de CallbackHandler prend en charge trois rappels :
    • CallerPrincipalCallback
    • GroupPrincipalCallback
    • PasswordValidationCallback
    Si CallbackHandler n'est pas utilisé par le module d'authentification et que validateRequest renvoie un statut de réussite, WebSphere Application Server requiert qu'une instance de table de hachage soit incluse dans le sujet du client avec les informations d'ID utilisateur pour qu'une connexion personnalisée puisse être établie afin d'obtenir les données d'identification de l'utilisateur. Cette table de hachage peut être ajoutée au sujet du client, comme dans l'exemple suivant :
    import java.util.Hashtable;
    import java.util.String;
    import javax.security.auth.Subject;
    import javax.security.auth.message.AuthException;
    import javax.security.auth.message.AuthStatus;
    import javax.security.auth.message.MessageInfo;
    import com.ibm.wsspi.security.registry.RegistryHelper;
    import com.ibm.wsspi.security.token.AttributeNameConstants.AttributeNameConstants;
    
    public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject)
           throws AuthException {
           ...
           UserRegistry reg = RegistryHelper.getUserRegistry(null);
           String uniqueid = reg.getUniqueUserID(username);
    
           Hashtable hashtable = new Hashtable();
           hashtable.put(AttributeNameConstants.WSCREDENTIAL_UNIQUEID, uniqueid);
           hashtable.put(AttributeNameConstants.WSCREDENTIAL_SECURITYNAME, username);
           hashtable.put(AttributeNameConstants.WSCREDENTIAL_PASSWORD, password);
           hashtable.put(AttributeNameConstants.WSCREDENTIAL_GROUPS, groupList); //optional
           clientSubject.getPrivateCredentials().add(hashtable);
           ...
    }

    Pour plus d'informations sur les exigences des tables de hachage et la connexion personnalisée, reportez-vous à la rubrique Développement de modules de connexion personnalisés pour une configuration de connexion système pour JAAS.

    To support the authenticate method of the Java Servlet 3.0 specification, the following logic must be added to the validateRequest method in the ServerAuthModule implementation class:
    import java.util.Map;
    import javax.security.auth.Subject;
    import javax.security.auth.message.AuthException;
    import javax.security.auth.message.AuthStatus;
    import javax.security.auth.message.MessageInfo;
    import javax.servlet.http.HttpServletRequest;
    
    public AuthStatus validateRequest(MessageInfo messageInfo, Subject clientSubject, Subject serviceSubject)
           throws AuthException {
           ...
           Map msgMap = messageInfo.getMap();
    
          if ("authenticate".equalsIgnoreCase(msgMap.get("com.ibm.websphere.jaspi.request"))) {
                  // this request is for the authenticate method
                  String authHeader
                       = ((HttpServletRequest) messageInfo.getRequestMessage()).getHeader("Authorization");
                  if (authHeader == null) {
                       // The user has not provided a username and password yet, return
                       // AuthStatus.SEND_CONTINUE to challenge
                  } 
                  else {
                       // Authenticate using the user name and password in the authentication header.
                  }
           }
           else {
                  // This is not a Servlet 3.0 authenticate request; handle as usual.
           }
           ...
    }
  5. Compilez toutes les classes nouvellement créées.
    Les fichiers JAR suivants de votre installation WebSphere Application Server doivent être spécifiés dans le chemin d'accès aux classes pour que la compilation des nouvelles classes aboutisse :
  6. Créez un fichier JAR avec les classes compilées.
    Suivant les exigences, le fichier JAR peut être placé dans l'un des trois emplacements suivants :
    • racine_serveur_app/lib

      Cet emplacement se trouve toujours dans le chemin d'accès aux classes du chargeur de classe WebSphere Application Server. A l'aide de cet emplacement, le fournisseur peut être enregistré pour un ensemble de modules Web ou d'applications comme fournisseur par défaut de la cellule ou du domaine pour tous les modules Web et applications et il peut être enregistré manuellement comme fournisseur persistant.

    • Bibliothèque partagée

      Placez le fichier JAR du fournisseur sur le système WebSphere Application Server. Configurez une bibliothèque partagée qui pointe vers ce fichier JAR et ajoutez cette bibliothèque partagée au chemin d'accès aux classes de l'application ou du serveur. Dans une bibliothèque partagée, le fournisseur peut être enregistré pour un ensemble de modules Web ou d'applications, mais il ne peut pas être utilisé comme fournisseur par défaut de la cellule ou du domaine. Par ailleurs, il ne peut pas être enregistré comme fournisseur persistant car la bibliothèque partagée ne se trouve pas dans le chemin d'accès aux classes pour l'enregistrement du fournisseur au démarrage du serveur. Pour plus d'informations sur la configuration d'une bibliothèque partagée, consultez la rubrique Création de bibliothèques partagées.

    • Imbriqué dans l'application

      Incluez le fichier JAR du fournisseur dans le fichier EAR de l'application comme JAR d'utilitaire ou imbriquez les fichiers de classe compilés dans le fichier WAR du module Web. Le fournisseur imbriqué peut être enregistré pour les modules Web de l'application à partir du moment où les classes sont incluses dans le chemin d'accès aux classes du module Web. Ce fournisseur ne peut pas être utilisé comme fournisseur de cellule ou de domaine par défaut ou enregistré comme fournisseur persistant. Les classes de l'application ne sont pas disponibles pour l'enregistrement du fournisseur au démarrage du serveur.

  7. Configurez le fournisseur dans la configuration de la sécurité à l'aide de la console d'administration ou d'un script d'administration.

    Pour plus d'informations, voir Configuration d'un fournisseur d'authentification JASPI à l'aide de la console d'administration ou Groupe de commandes JaspiManagement pour l'objet AdminTask.


Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_jaspi_develop
Nom du fichier : tsec_jaspi_develop.html