Puede utilizar anotaciones para proteger una aplicación empresarial Java™ EE directamente en el código fuente.
Anotaciones de seguridad comunes: JSR 250 define varias
anotaciones de seguridad comunes. Se definen cinco anotaciones de seguridad:
- javax.annotation.security.PermitAll:
- Se puede utilizar a nivel de tipo o método.
- Indica que todo el mundo puede acceder al método especificado o a todos los
métodos de negocio del EJB especificado.
- javax.annotation.security.DenyAll:
- Se puede utilizar a nivel de método.
- Indica que nadie puede acceder al método especificado en el EJB.
- javax.annotation.security.RolesAllowed:
- Se puede utilizar a nivel de tipo o método.
- Indica que los usuarios asociados con la lista de roles pueden acceder al método
especificado o a todos los métodos de negocio del EJB.
- javax.annotation.security.DeclareRoles:
- Se puede utilizar a nivel de tipo.
- Define roles para la comprobación de seguridad. Puede ser utilizado por
EJBContext.isCallerInRole, HttpServletRequest.isUserInRole y
WebServiceContext.isUserInRole.
- javax.annotation.security.RunAs:
- Se puede utilizar a nivel de tipo.
- Especifica el rol RunAs para los componentes especificados.
Utilizar anotaciones de seguridad
- Para las anotaciones @PermitAll, @DenyAll y @RolesAllowed, una anotación a
nivel de clase se aplica a una clase y una anotación a nivel de método se aplica a
un método.
Una anotación a nivel de método altera temporalmente el comportamiento de una
anotación a nivel de clase.
@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;
}
}
En este ejemplo, todo el mundo puede acceder al método hello() y los
usuarios del rol team pueden acceder al método goodbye().
- La anotación @DeclareRoles define una lista de roles que utilizará un componente
especificado. En el entorno Java EE
5 o 6, puede buscar el recurso utilizando @javax.annotation.Resource y comprobar si
el usuario tiene el rol indicado invocando las API siguientes:
Tabla 1. . API utilizada por componente Java EEComponente |
API utilizada para comprobar rol |
EJB |
javax.ejb.EJBContext.isCallerInRole(role) |
Servlet |
javax.servlet.http.HttpServletRequest.isUserInRole(role) |
Servicio web |
javax.xml.ws.WebServiceContext.isUserInRole(role) |
- Las anotaciones @PermitAll, @DenyAll y @RolesAllowed le permiten implementar la
mayoría de las decisiones de autorización. Pero para aplicar una lógica más
compleja, utilice la anotación @DeclareRoles. Por ejemplo, suponga que el método
hello debe ser accesible para un usuario que tiene el rol A y que no tiene el rol B
al mismo tiempo. El siguiente fragmento de código permite lograr ese objetivo:
@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 {
...
}
}
}
Utilización no válida de anotaciones de
seguridad