Service d'autorisation et d'authentification Java
L'architecture de la sécurité Java™ 2 utilise une stratégie de sécurité afin d'indiquer quels droits d'accès sont accordés au code d'exécution. Cette architecture est axée sur le code. Les droits sont accordés en fonction des caractéristiques du code, notamment l'origine du code, la signature numérique du code et le signataire. L'autorisation JAAS (Java Authentication and Authorization Service) ajoute aux contrôles d'accès par code les contrôles d'accès par utilisateur. Les droits sont accordés en fonction du code en cours d'exécution et de l'utilisateur qui l'exécute.
Lors de l'utilisation de la méthode d'authentification JAAS pour authentifier un utilisateur, un sujet est créé pour représenter l'utilisateur authentifié. Un sujet se compose d'un ensemble de principaux, chacun d'eux représentant une identité pour cet utilisateur. Vous pouvez accorder des droits d'accès dans la stratégie à des principaux spécifiques. Une fois que l'utilisateur authentifié, l'application peut associer le sujet au contexte de contrôle d'accès en cours. Pour chaque opération de vérification de sécurité ultérieure, l'exécution Java détermine automatiquement si la stratégie n'accorde les droits requis qu'à un principal spécifique uniquement. Si c'est le cas, l'opération n'est prise en charge que si le sujet associé au contexte de contrôle d'accès contient le principal désigné.
Associez un sujet au contexte de contrôle d'accès en cours en appelant la méthode doAs statique à partir de la classe du sujet et en transmettant un sujet authentifié et la méthode java.security.PrivilegedAction ou java.security.PrivilegedExceptionAction. La méthode doAs associe le sujet fourni au contexte de contrôle d'accès en cours puis appelle la méthode run à partir de l'action. L'implémentation de la méthode run contient l'ensemble du code qui s'exécute en tant que sujet indiqué. L'action s'exécute en tant que sujet indiqué.
Dans le modèle de programmation J2EE (Java 2 Platform, Enterprise Edition), lors de l'appel de la méthode EJB (Enterprise JavaBeans) à partir d'un bean enterprise ou d'un servlet, la méthode s'exécute sous l'identité de l'utilisateur qui est déterminée par le paramètre run-as. La spécification J2EE version 1.4 n'indique pas l'identité de l'utilisateur à utiliser lors de l'appel d'un bean enterprise à partir d'un bloc d'actions Subject.doAs dans le code d'EJB ou dans le code du servlet. Une extension logique consiste à utiliser l'identité correcte indiquée dans le sujet lors de l'appel de la méthode EJB dans le bloc d'actions doAs du sujet.
Le fait de permettre à l'action Subject.doAs de remplacer le paramètre d'identité d'exécution est un moyen idéal d'intégrer le modèle de programmation JAAS dans l'environnement d'exécution J2EE. Toutefois, un incident est apparu dans Software Development Kit (SDK), Java Technology Edition, versions 1.3 et ultérieures lors de l'implémentation de JAAS, version 1.0 ou d'une version ultérieure avec l'architecture de sécurité Java 2. Un sujet qui est associé au contexte de contrôle d'accès est supprimé par un appel doPrivileged lorsqu'un événement doPrivileged se produit dans le bloc d'actions Subject.doAs. Tant que ce problème n'est pas résolu, il n'existe aucun moyen efficace et fiable de garantir le comportement correct de l'action Subject.doAs dans un environnement d'exécution J2EE.
Subject.doAs(subject, new java.security.PrivilegedAction() {
Public Object run() {
// L'instance Subject est associée au contexte d'unité d'exécution en cours
java.security.AccessController.doPrivileged( new
java.security.PrivilegedAction() {
public Object run() {
// L'instance Subject a été retirée du contexte
// d'unité d'exécution en cours
return null;
}
});
// L'instance Subject est associée au contexte d'unité d'exécution en cours
return null;
}
});
Pour contourner cette difficulté, WebSphere Application Server met à votre disposition la classe auxiliaire WSSubject afin d'étendre l'autorisation JAAS à un appel de méthode EJB J2EE, comme précédemment décrit. La classe WSSubject fournit des méthodes doAs et doAsPrivileged statiques qui ont des signatures identiques à la classe subject. La méthode WSSubject.doAs associe le Subject à l'unité d'exécution en cours. Les méthodes WSSubject.doAs et WSSubject.doAsPrivileged appellent ensuite les méthodes Subject.doAs et Subject.doAsPrivileged correspondantes. Le justificatif d'origine est restauré et associé à l'unité d'exécution en cours lorsque vous quittez les méthodes WSSubject.doAs et WSSubject.doAsPrivileged.
La classe WSSubject ne remplace pas l'objet Subject, mais une classe auxiliaire afin de garantir un comportement d'exécution cohérent en matière d'appel de méthode d'EJB.
WSSubject.doAs(subject, new java.security.PrivilegedAction() {
Public Object run() {
// L'instance Subject est associée au contexte d'unité d'exécution en cours
java.security.AccessController.doPrivileged( new
java.security.PrivilegedAction() {
public Object run() {
// L'instance Subject a été retirée du contexte
// d'unité d'exécution en cours.
return null;
}
});
// L'instance Subject est associée au contexte d'unité d'exécution en cours
return null;
}
});
- L'objet Subject généré par les instances WSLoginModuleImpl et WSClientLoginModuleImpl contient un principal qui implémente l'interface WSPrincipal. L'application de la méthode getCredential à un objet WSPrincipal renvoie un objet qui implémente l'interface WSCredential. Vous pouvez également trouver l'instance de l'objet WSCredential dans la liste PublicCredentials de l'instance Subject. Extrayez l'objet WSCredential de la liste PublicCredentials au lieu d'utiliser la méthode getCredential.
- La méthode getCallerPrincipal de la classe WSSubject renvoie une chaîne représentant l'identité de sécurité de l'appelant. Le type de retour diffère de la méthode getCallerPrincipal de l'interface EJBContext java.security.Principal.
- L'objet Subject généré par le module J2C (Java 2 Connector) DefaultPrincipalMapping contient un principal de ressource et une liste PasswordCredentials. Le principal de ressource représente l'identité RunAs.