Vous pouvez sécuriser votre application d'entreprise Java™
EE directement dans le code source à l'aide
d'annotations.
Annotations de sécurité communes : JSR 250 définit un certain nombre d'annotations de sécurité communes. Cinq annotations de sécurité sont définies :
- javax.annotation.security.PermitAll :
- Peut être utilisée au niveau type ou méthode.
- Indique que la méthode donnée ou toutes les méthodes métier de l'EJB donné sont accessibles par tout le monde.
- javax.annotation.security.DenyAll :
- Peut être utilisée au niveau méthode.
- Indique que la méthode donnée de l'EJB n'est accessible par personne.
- javax.annotation.security.RolesAllowed :
- Peut être utilisée au niveau type ou méthode.
- Indique que la méthode donnée ou toutes les méthodes métier de l'EJB sont accessibles par les utilisateurs associés à la liste de rôles.
- javax.annotation.security.DeclareRoles :
- Peut être utilisée au niveau type.
- Définit des rôles pour le contrôle de la sécurité. A utiliser par EJBContext.isCallerInRole,
HttpServletRequest.isUserInRole et WebServiceContext.isUserInRole.
- javax.annotation.security.RunAs :
- Peut être utilisée au niveau type.
- Spécifie le rôle d'identité d'exécution (RunAs) pour les composants donnés.
Utilisation d'annotations de sécurité
- Pour les annotations @PermitAll, @DenyAll et @RolesAllowed, une annotation de niveau classe s'applique à une classe et une annotation de niveau méthode s'applique à une méthode. Une annotation de niveau méthode remplace le comportement d'une annotation de niveau classe.
@Stateless
@RolesAllowed("team")
public class TestEJB implements Test {
@PermitAll
public String hello(String msg) {
return "Hello, " + msg;
}
public String goodbye(String msg) {
return "Goodbye, " + msg;
}
}
Dans cet exemple, la méthode hello() est accessible par tout le monde, et la méthode goodbye() est accessible par les utilisateurs du rôle "team".
- L'annotation @DeclareRoles définit une liste de rôles à utiliser par un composant donné. Dans l'environnement
Java EE 5 ou 6, vous pouvez
rechercher les ressources à l'aide de @javax.annotation.Resource et vérifier si l'utilisateur possède l'un des rôles donnés en
appelant les API suivantes :
Tableau 1. . API utilisée par le composant Java EEComposant |
API utilisée pour vérifier le rôle |
EJB |
javax.ejb.EJBContext.isCallerInRole(role) |
Servlet |
javax.servlet.http.HttpServletRequest.isUserInRole(role) |
Service Web |
javax.xml.ws.WebServiceContext.isUserInRole(role) |
- Les annotations @PermitAll, @DenyAll et @RolesAllowed vous permettent d'implémenter la plupart de la logique de décision des autorisations. Cependant, pour mettre en oeuvre des logiques plus complexes, utilisez l'annotation @DeclareRoles. Par exemple, supposons que la méthode hello doive être accessible par un utilisateur qui ne possède pas le rôle A et le rôle B en même temps. L'extrait de code suivant permet de résoudre ce problème :
@Stateless
@DeclaresRoles({"A", "B"})
public class TestEJB implements Test {
@Resource private SessionContext sc;
public String hello(String msg) {
if (sc.isCallerInRole("A") && !sc.isCallerInRole("B")) {
...
} else {
...
}
}
}
Utilisation non valide d'annotations de sécurité