Développement d'un fournisseur d'authentification JASPIC personnalisé pour Liberty

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

Avant de commencer

Passez en revue les exigences d'interface spécifiques aux fournisseurs et modules d'authentification JASPIC dans la spécification JSR 196: Java Authentication Service Provider Interface for Containers.

Pourquoi et quand exécuter cette tâche

WebSphere Application Server Liberty prend en charge l'utilisation de fournisseurs d'authentification tiers non compatibles avec le conteneur de servlet spécifié dans JASPIC (Java Authentication SPI for Containers) Version 1.1.

Le conteneur de servlet définit les interfaces qui sont utilisées par l'environnement d'exécution de sécurité en collaboration avec le conteneur Web dans WebSphere Application Server pour l'appel des modules d'authentification avant et après qu'une demande Web soit traitée par une application. Une authentification qui utilise des modules JASPIC n'est effectuée que lorsque JASPIC est activé dans la configuration des paramètres de sécurité.

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 bien ils peuvent ajouter manuellement les informations d'identité utilisateur nécessaires au sujet du client.

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 constructeur à deux arguments public 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 doit être traitée par le module Web de l'application. La méthode getServerAuthConfig permet d'obtenir une instance ServerAuthConfig. L'argument CallbackHandler de l'appel de méthode est utilisé par le module authentication.

  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 sont utilisées pour 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 est utilisée pour appeler le module qui authentifie le message de demande Web reçu. Si l'authentification aboutit, le conteneur Web attribue 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 {
                    ...
            }
            public void cleanSubject(MessageInfo messageInfo, Subject subject)
                    throws AuthException {
                    ...
            }
    }

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

    Les méthodes validateRequest et secureResponse de cette classe sont utilisées pour authentifier javax.servlet.http.HttpServletRequest et javax.servlet.http.HttpServletResponse contenus dans l'élément javax.security.auth.message.MessageInfo qui est reçu. Ces méthodes peuvent utiliser l'instance CallbackHandler ui est reçue dans la méthode initialize pour interagir avec l'environnement d'exécution de sécurité WebSphere afin de valider un mot de passe utilisateur, et le registre d'utilisateurs actif pour extraire un ID unique et un groupe d'appartenance pour un utilisateur. Les données extraites sont placées dans un élément Hashtable dans le jeu de données d'identification privé du sujet client. L'implémentation WebSphere Application Server de l'élément CallbackHandler prend en charge les trois rappels suivants :
    • CallerPrincipalCallback
    • GroupPrincipalCallback
    • PasswordValidationCallback

    WebSphere Application Server s'attend à ce que les valeurs de nom obtenues avec PasswordValidationCallback.getUsername() et CallerPrincipalCallback.getName() soient identiques. Si ce n'est pas le cas, les résultats peuvent être imprévisibles. La méthode handle() de l'élément CallbackHandler traite chaque rappel qui est fourni dans le tableau d'arguments de la méthode de manière séquentielle. Par conséquent, la valeur de nom défini dans les données d'identification privées du sujet client sont celles obtenues du dernier appel traité.

    Si CallbackHandler n'est pas utilisé par le module d'authentification, et si validateRequest renvoie un statut de réussite, WebSphere Application exige qu'une instance Hashtable soit incluse dans clientSubject avec les informations d'identité utilisateur de sorte qu'une connexion personnalisée puisse être effectuée afin d'obtenir les données d"identification de l'utilisateur. L'élément Hashtable peut être ajouté au sujet client comme illustré 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 éléments Hashtable requis et la connexion personnalisée, voir Développement de modules de connexion JAAS personnalisés pour une configuration de connexion système.


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

Nom du fichier : twlp_develop_jaspic.html