Exemple : Module de connexion personnalisé pour le mappage entrant
Cet exemple présente un module de connexion personnalisé qui crée une table de hachage java.util.Hashtable d'après le rappel NameCallback indiqué. La table de hachage java.util.Hashtable est ajoutée à la mappe sharedState java.util.Map de sorte que les modules de connexion WebSphere Application Server puissent localiser les informations dans la table de hachage.
public customLoginModule()
{
public void initialize(Subject subject, CallbackHandler callbackHandler,
Map sharedState, Map options)
{
// (Pour plus d'informations sur l'initialisation, voir
// Développement de modules de connexion personnalisés pour une configuration de connexion système pour JAAS.)
_sharedState = sharedState;
}
public boolean login() throws LoginException
{
// (Pour plus d'informations sur les actions à effectuer pendant la connexion, voir
// Développement de modules de connexion personnalisés pour une configuration de connexion système pour JAAS.)
// Gère le WSTokenHolderCallback pour savoir s'il s'agit d'une
// connexion initiale ou par propagation.
javax.security.auth.callback.Callback callbacks[] =
new javax.security.auth.callback.Callback[3];
callbacks[0] = new javax.security.auth.callback.NameCallback("");
callbacks[1] = new javax.security.auth.callback.PasswordCallback(
"Password: ", false);
callbacks[2] = new com.ibm.websphere.security.auth.callback.
WSCredTokenCallbackImpl("");
callbacks[3] = new com.ibm.wsspi.security.auth.callback.
WSTokenHolderCallback("");
try
{
callbackHandler.handle(callbacks);
}
catch (Exception e)
{
// Gère l'exception
}
// Détermine les rappels qui contiennent des informations
boolean identitySwitched = false;
String uid = ((NameCallback) callbacks[0]).getName();
char password[] = ((PasswordCallback) callbacks[1]).getPassword();
byte[] credToken = ((WSCredTokenCallbackImpl) callbacks[2]).getCredToken();
java.util.List authzTokenList = ((WSTokenHolderCallback) callbacks[3]).
getTokenHolderList();
if (credToken != null)
{
try
{
String uniqueID = WSSecurityPropagationHelper.validateLTPAToken(credToken);
String realm = WSSecurityPropagationHelper.getRealmFromUniqueID (uniqueID);
// A présent, attribue la valeur de l'ID utilisateur à la chaîne pour
// le mappage ou la connexion.
uid = WSSecurityPropagationHelper.getUserFromUniqueID (uniqueid);
}
catch (Exception e)
{
// gérer l'exception
}
}
else if (uid == null)
{
// Les données d'authentification ne sont pas valides. Vous devez disposer du numéro d'utilisateur
// ou du jeton CredToken
throw new WSLoginFailedException("invalid authentication data.");
}
else if (uid != null && password != null)
{
// Il s'agit d'une authentification type. Vous pouvez choisir de mapper cet ID vers
// un autre ID ou de l'ignorer et de laisser WebSphere Application Server
// effectuer la connexion à votre place. Lorsque les mots de passe sont présentés, veillez à ne pas
// valider le mot de passe car il s'agit de l'authentification initiale.
return true;
}
// Vous pouvez mapper cet UID vers un autre élément et définir une valeur booléenne
// pour identitySwitched. Si l'identité a été modifiée, effacez les attributs propagés
// ci-après afin qu'ils ne soient pas utilisés de manière inappropriée.
uid = myCustomMappingRoutine (uid);
// Efface les attributs propagés car ils ne s'appliquent plus à la nouvelle identité
if (identitySwitched)
{
((WSTokenHolderCallback) callbacks[3]).setTokenHolderList(null);
}
boolean requiresLogin = ((com.ibm.wsspi.security.auth.callback.
WSTokenHolderCallback) callbacks[2]).getRequiresLogin();
if (requiresLogin || identitySwitched)
{
// Extrait le contexte initial par défaut pour ce serveur.
javax.naming.InitialContext ctx = new javax.naming.InitialContext();
// Extrait l'objet UserRegistry local.
com.ibm.websphere.security.UserRegistry reg =
(com.ibm.websphere.security.UserRegistry) ctx.lookup("UserRegistry");
// Extrait l'ID unique de registre d'après le numéro d'utilisateur spécifié
// dans NameCallback.
String uniqueid = reg.getUniqueUserId(uid);
uid = WSSecurityPropagationHelper.getUserFromUniqueID (uniqueid);
// Extrait le nom d'affichage du registre d'utilisateurs d'après l'uniqueID.
String securityName = reg.getUserSecurityName(uid);
// Extrait les groupes associés à l'ID unique.
java.util.List groupList = reg.getUniqueGroupIds(uid);
// Crée la java.util.Hashtable avec les informations que vous avez regroupées
// à partir du registre UserRegistry.
java.util.Hashtable hashtable = new java.util.Hashtable();
hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants.
WSCREDENTIAL_UNIQUEID, uniqueid);
hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants.
WSCREDENTIAL_SECURITYNAME, securityName);
hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants.
WSCREDENTIAL_GROUPS, groupList);
// Ajoute une clé de mémoire cache qui est utilisée dans le mécanisme de recherche
// pour l'objet créé. La clé de mémoire cache peut être un objet, mais possède
// une méthode toString implémentée. Assurez-vous que cacheKey contient suffisamment
// d'informations pour les étendre à l'utilisateur et aux autres attributs que vous
// utilisez. Si vous ne spécifiez pas cette propriété, le sujet est étendu par défaut au
// WSCREDENTIAL_UNIQUEID renvoyé.
hashtable.put(com.ibm.wsspi.security.token.AttributeNameConstants.
WSCREDENTIAL_CACHE_KEY, "monAttributPersonnalisé" + uniqueid);
// Ajoute la table de hachage à l'état partagé du sujet.
_sharedState.put(com.ibm.wsspi.security.token.AttributeNameConstants.
WSCREDENTIAL_PROPERTIES_KEY,hashtable);
}
else if (requiresLogin == false)
{
// Pour plus d'informations sur cette section, voir
// Propagation des attributs de sécurité.
// Si vous avez ajouté une implémentation de jeton personnalisée, vous pouvez effectuer
// une recherche dans la liste de contenus de jeton pour qu'elle effectue une
// désérialisation.
// Remarque : Tous les objets Java sont automatiquement désérialisés par
// wsMapDefaultInboundLoginModule
for (int i = 0; i< authzTokenList.size(); i++)
{
TokenHolder tokenHolder = (TokenHolder) authzTokenList.get(i);
if (tokenHolder.getName().equals("com.acme.MyCustomTokenImpl"))
{
byte[] myTokenBytes = tokenHolder.getBytes();
// Transmet ces octets au constructeur de votre classe d'implémentation
// pour désérialisation.
com.acme.MyCustomTokenImpl myTokenImpl = new com.acme.MyCustomTokenImpl(myTokenBytes);
}
}
}
}
public boolean commit() throws LoginException
{
// (Pour plus d'informations sur les actions à effectuer pendant une validation, voir
// Développement de modules de connexion personnalisés pour une configuration de connexion système pour JAAS.)
}
// Définit vos variables de module de connexion
com.ibm.wsspi.security.token.AuthorizationToken customAuthzToken = null;
com.ibm.wsspi.security.token.AuthenticationToken defaultAuthToken = null;
java.util.Map _sharedState = null;
}