Développement à l'aide des API de sécurité par programmation pour les applications Web
Utilisez cette rubrique pour sécuriser par programmation vos applications Enterprise JavaBeans (EJB).
Pourquoi et quand exécuter cette tâche
- IsCallerInRole (nom de rôle) : renvoie la valeur true si l'appelant du bean possède le rôle de sécurité spécifié par le nom du rôle. Dans le cas contraire ou si l'appelant n'est pas authentifié, la valeur false est renvoyée. Si le rôle indiqué correspond à l'accès Tous les utilisateurs, la valeur true est toujours retournée.
- getCallerPrincipal : Renvoie l'objet java.security. Principal qui contient le nom du demandeur de bean. Si l'appelant n'est pas authentifié, un objet principal contenant le nom non autorisé est renvoyé.
Vous pouvez activer un module de connexion pour indiquer quelle classe de principal est renvoyée par ces appels.
Si vous utilisez la méthode isCallerInRole, déclarez un élément security-role-ref dans le descripteur de déploiement avec un sous-élément role-name contenant le nom du rôle transmis à cette méthode. Les rôles réels étant créés au cours de la phase d'assemblage de l'application, vous pouvez utiliser un rôle logique en tant que nom du rôle et fournir suffisamment de conseils à l'assembleur dans la description de l'élément security-role-ref pour lier ce rôle à un rôle réel. Au cours de l'assemblage, l'assembleur crée un sous-élément role-link pour lier le nom du rôle au rôle réel. La création d'un élément security-role-ref est possible si un outil d'assemblage, tel que Rational Application Developer est utilisé. Vous pouvez également créer l'élément security-role-ref lors de la phase d'assemblage à l'aide d'un outil d'assemblage.
Procédure
- Ajoutez les méthodes de sécurité requises dans le code du module EJB.
- Créez un élément security-role-ref avec une zone role-name pour tous les noms de rôle utilisés dans la méthode isCallerInRole. Si aucun élément security-role-ref n'est créé au cours du développement, vérifiez s'il est créé au cours de la phase d'assemblage.
Résultats
Exemple
L'utilisation des fonctions du modèle de sécurité Java EE pour spécifier les règles de sécurité de manière déclarative est particulièrement utile lorsqu'une application EJB tente d'accéder à des ressources externes et d'en contrôler l'accès à l'aide de son tableau d'autorisation (mappage entre ressources et utilisateurs). Dans ce cas, utilisez la méthode getCallerPrincipal() pour extraire l'identité de l'appelant ; l'application peut alors consulter sa propre table d'autorisations pour procéder aux autorisations. L'identification de l'appelant permet également d'extraire des informations sur les utilisateurs correspondants à partir d'une source externe, telle qu'une base de base de données ou un bean enterprise. Vous pouvez utiliser la méthode isCallerInRole de manière similaire.
<security-role-ref>
<description>Fournit des conseils à l'assembleur pour relier l'élément role-name au
rôle réel<\description>
<role-name>Mgr<\role-name>
</security-role-ref>
<security-role-ref>
<description>Conseils fournis par le développeur pour mapper l'élément role-name vers role-link</description>
<role-name>Mgr</role-name>
<role-link>Manager</role-link>
</security-role-ref>
public class aSessionBean implements SessionBean {
.....
// SessionContext étend EJBContext. S'il s'agit d'un bean entity, utilisez EntityContext
javax.ejb.SessionContext context;
// La méthode suivante sera appelée automatiquement par le
// conteneur d'EJB
public void setSessionContext(javax.ejb.SessionContext ctx) {
ontext = ctx; // sauvegarder le contexte du bean de session
}
....
private void aBusinessMethod() {
....
// pour connaître l'appelant du bean à l'aide de getCallerPrincipal()
java.security.Principal principal = context.getCallerPrincipal();
String callerId= principal.getName();
// pour vérifier si l'appelant du bean possède le rôle Mgr
boolean isMgr = context.isCallerInRole("Mgr");
// utilisez les informations précédentes comme
// l'application le requiert.
....
}
....
}
@javax.annotation.security.DeclareRoles("Mgr")
@Stateless // l'annotation est utilisé pour signaler un bean session
public class aSessionBean implements MyBusinessInterface { //vous n'avez pas à étendre l'interface sessionbean
.....
// SessionContext étend EJBContext. Dans EJB 3.0 utilisez l'annotation Resource pour injecter le contexte
@Resource
javax.ejb.SessionContext context; }
....
private void aBusinessMethod() {
....
// pour connaître l'appelant du bean à l'aide de getCallerPrincipal()
java.security.Principal principal = context.getCallerPrincipal();
String callerId= principal.getName();
// pour vérifier si l'appelant du bean possède le rôle Mgr
boolean isMgr = context.isCallerInRole("Mgr");
// utilisez les informations précédentes comme
// l'application le requiert.
....
}
....
}