Anotaciones de seguridad

Las anotaciones son un mecanismo de programación eficaz que se derivan de la recomendación JSR-175. Una anotación es un modo estándar de incluir comportamientos soportados de seguridad a la vez que se permite la generación automática de archivos de código fuente y configuración.

En Java™ Platform, Enterprise Edition (Java EE) 5 y posteriores, los roles y políticas de seguridad pueden definirse mediante anotaciones, así como en el descriptor de despliegue. Durante la instalación de la aplicación, las políticas y los roles de seguridad definidos mediante anotaciones se fusionan con las políticas y los roles de seguridad definidos en el descriptor de despliegue. Esta fusión se lleva a cabo mediante el recurso AMM (Annotations Metadata Manager). Cuando se fusionan los metadatos, se utilizan las reglas de herencia siguientes.
Tabla 1. Reglas de herencia de la fusión de metadatos.

En esta tabla se listan las reglas de herencia de la fusión de metadatos.

Escenario Normas
Metadatos de seguridad en el descriptor de despliegue solamente No es necesario llevar a cabo ninguna fusión. Se propagan los metadatos de seguridad del descriptor de despliegue.
Metadatos de seguridad en anotaciones solamente No es necesario llevar a cabo ninguna fusión. Se propagan los metadatos de seguridad definidos con anotaciones.
Metadatos de seguridad en el descriptor de despliegue y anotaciones Se fusionan los metadatos del descriptor de despliegue y de las anotaciones. Los metadatos de las anotaciones son reemplazados por el mismo tipo de datos del descriptor de despliegue.
Actualmente, se ofrece soporte a seis anotaciones de seguridad. Para cada anotación, se define una implementación MergeAction.
  • @DeclareRoles (Servlet 2.5 y superior y EJB 3)

    La implementación MergeAction encuentra todas las clases anotadas con la anotación DeclareRoles. En cada clase anotada de cada nombre de rol especificado, si los roles de seguridad enumerados en el descriptor de despliegue no contienen ningún rol SecurityRole con el nombre de rol anotado, se creará un rol SecurityRole nuevo y se añadirá a la lista de roles de seguridad.

  • @RunAs (Servlet 2.5 y superior y EJB 3)

    La implementación MergeAction encuentra todas las clases con la anotación RunAs. Para cada clase anotada, se encuentra el servlet o el Enterprise Java Bean (EJB) asociado a la clase en cuestión. A continuación, se determina si se define un elemento run-as en el descriptor de despliegue del servlet o EJB. Si no se encuentra ninguno, se creará un elemento run-as nuevo y se añadirá al descriptor de despliegue. Si se encuentra un elemento run-as, se utilizará este elemento en lugar de crear uno nuevo. El nombre de rol utilizado en la anotación RunAs deberá definirse en el descriptor de despliegue.

  • @DenyAll (sólo EJB 3)

    La implementación MergeAction encuentra todos los métodos anotados con la anotación DenyAll. Para cada método anotado, si el método no se incluye en la lista del descriptor de despliegue de métodos excluidos y no hay ningún método MethodPermission en el descriptor de despliegue, se creará un nuevo método MethodElement y se añadirá a la lista de métodos excluidos del descriptor de despliegue.

  • @PermitAll (sólo EJB 3)

    La implementación MergeAction encuentra todas las clases y los métodos con la anotación PermitAll. Para cada clase anotada, se encuentra el Enterprise Java Bean (EJB) asociado a la clase dada. A continuación, busca un subconjunto de elementos MethodElements en la lista de todos los MethodPermissions definidos en el descriptor de despliegue para este EJB. Si no se encuentra ningún MethodElement con el nombre de método de comodín (“*”) y no hay ningún método de comodín en la lista de métodos excluidos ni en la lista de MethodElements con roles de seguridad, se crearán un MethodPermission y un MethodElement nuevos. El nuevo MethodPermission se marca como deseleccionado y se añade a la lista MethodPermission del descriptor de despliegue. Se añade el nuevo MethodElement a la lista MethodElement del recién creado MethodPermission que aparece sin seleccionar. Se realiza una acción similar para todos los métodos anotados. En lugar de un MethodElement de comodín, la firma de método debe coincidir exactamente con la firma del método anotado.

  • @RolesAllowed (sólo EJB 3)

    La implementación de MergeAction encuentra todos los métodos y clases con la anotación RolesAllowed. Para cada clase anotada, se encuentra el Enterprise Java Bean (EJB) asociado con la clase en cuestión. A continuación, busca un subconjunto de elementos MethodElements en la lista de todos los MethodPermissions definidos en el descriptor de despliegue para este EJB. Si no se encuentra ningún MethodElement con un nombre de método de comodín (“*”) y no hay ningún método de comodín en la lista de métodos excluidos ni en la lista de MethodElements sin seleccionar, se crearán un MethodPermission y un MethodElement nuevos. Si existe un MethodPermission para este EJB con exactamente los mismos roles que los que se han encontrado en la anotación, se utilizará este MethodPermission en lugar de crear uno nuevo. Para cada nombre de rol especificado en la anotación, se creará un SecurityRole nuevo y se añadirá a la lista SecurityRole de MethodPermission. En el caso de que se hubiera creado un MethodPermission nuevo, se añadirá a la lista MethodPermission del descriptor de despliegue. El nuevo MethodElement creado se añade a la lista MethodElement del MethodPermission. Se realiza un procedimiento similar para todos los métodos anotados. En lugar de un MethodElement de comodín, la firma de método debe coincidir exactamente con la firma del método anotado. Además, para cada nombre de rol especificado en la anotación, si la lista de roles de seguridad del descriptor de despliegue no contiene ningún SecurityRole con el nombre de rol anotado, se creará un SecurityRole nuevo y se añadirá a la lista de roles de seguridad.

  • @ServletSecurity (sólo Servlet 3.0)
    Nota: El soporte de la anotación ServletSecurity para Servlet 3.0 es una novedad de este release de WebSphere Application Server.

    Cuando se despliega una aplicación, la implementación ServletSecurity MergeAction busca todos los servlets con la anotación ServletSecurity. Para cada servlet anotado, encuentra el servlet asociado con la clase en cuestión basada en la anotación WebServlet. Si RolesAllowed en la anotación ServletSecurity no se encuentra en el descriptor de despliegue, a continuación, crea un atributo role-name para el rol en el descriptor de despliegue.

    Cuando se inicia una aplicación, WebContainer inspecciona todos los servlets con las anotaciones RunAs, declareRoles y ServletSecurity establece estas anotaciones en el método setServletSecurity() de la anotación ServletRegistration. El contenedor notifica el componente de seguridad para inspeccionar todas las anotaciones ServletRegistration que tienen patrones de URL y restricciones de seguridad. A continuación, el componente de seguridad determina si hay un patrón de URL definido en el descriptor de despliegue. Si no se ha definido ninguno en el descriptor de despliegue, se crean y se utilizan las restricciones de seguridad y el rol RunAs del patrón de URL. Si ya hay una coincidencia exacta definida en el descriptor de despliegue, se utilizan las restricciones de seguridad y el rol RunAs del patrón de URL del descriptor de despliegue en lugar de los datos de la anotación.

    Nota: Si la propiedad del sistema de autenticación web, com.ibm.wsspi.security.web.webAuthReq, se establece en persisting, puede iniciar sesión en un URL no protegido si se proporcionan un usuario y una contraseña válidos.

    La anotación de servlet heredado es una anotación de metadatos. No especifique la anotación heredada en la clase. Si una subclase no tiene una anotación de seguridad, hereda automáticamente la anotación de seguridad de la clase padre. La subclase puede sobrescribir las anotaciones de seguridad padre especificando su anotaciones de seguridad.

    El ejemplo siguiente es para todos los métodos HTTP sin restricciones:
    @WebServlet ("/Example") 
    @ServletSecurity
    public class Example extends HttpServlet {
           ……
    }
    El ejemplo siguiente es para todos los métodos HTTP que no tienen ningún elemento <auth-constraint> y requieren TransportGuarantee:
    @WebServlet ("/Example")
    @ServletSecurity(@HttpConstraint(transportGuarantee =
                          TransportGuarantee.CONFIDENTIAL))
    public class Example extends HttpServlet {
           ……
    }
    El ejemplo siguiente es para todos los métodos HTTP con todo el acceso denegado:
    @WebServlet ("/Example")
    @ServletSecurity(@HttpConstraint(EmptyRoleSemantic.DENY))
    public class Example extends HttpServlet {
           ……
    }
    El ejemplo siguiente es para todos los métodos HTTP excepto para los valores GET y POST sin restricciones. Parta GET, el elemento <auth-constraint> requiere pertenencia a ALL ROLE. Para POST, se ha denegado todo el acceso.
    @WebServlet (name="Example", urlPatterns={"/Example"})
    @ServletSecurity((httpMethodConstraints = {
    		@HttpMethodConstraint(value = "GET", rolesAllowed = “ALL ROLE"),
    		@HttpMethodConstraint(value="POST“, emptyRoleSemantic =
    EmptyRoleSemantic.DENY))
    })
    public class Example extends HttpServlet {
           ……
    }
    El ejemplo siguiente es para todos los métodos HTTP excepto GET, el elemento <auth-constraint> requiere pertenencia en ALL ROLE y el método GET no tiene restricciones.
    @WebServlet (name="Example", urlPatterns={"/Example"})
    @ServletSecurity(value = @HttpConstraint(rolesAllowed = "ALL ROLE"),
    	 httpMethodConstraints = @HttpMethodConstraint("GET"))
    public class Example extends HttpServlet {
           ……
    }
    El siguiente ejemplo es para todos los métodos HTTP excepto TRACE, el elemento <auth-constraint> requiere pertenencia a ALL ROLE, y para TRACE, se ha denegado todo el acceso.
    @WebServlet (name="Example", urlPatterns={"/Example"})
    @ServletSecurity(value = @HttpConstraint(rolesAllowed = "ALL ROLE"),
    	 httpMethodConstraints = @HttpMethodConstraint(value="TRACE",
    	 emptyRoleSemantic = EmptyRoleSemantic.DENY))
    public class Example extends HttpServlet {
           ……
    }

Icon that indicates the type of topic Concept topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=csec_annotations
File name: csec_annotations.html