Vou 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.
Pourquoi et quand exécuter cette tâche
Le profil Liberty de WebSphere Application Server prend
en charge l'utilisation de fournisseurs d'authentification tiers qui
respectent le profil de conteneur de
servlet spécifié dans Java
Authentication SPI for Containers (JASPIC)
Version 1.1.
Le profil de 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 obligatoires noté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.
- 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.
- 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.
- 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é.
- 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 des groupes 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.