Protección de recursos JAX-RS 2.0 mediante anotaciones

Puede proteger los recursos JAX-RS (Java™ API for RESTful Web Services) mediante anotaciones que especifiquen los valores de seguridad.

Antes de empezar

En esta tarea se presupone que ha desarrollado la aplicación y ha identificado los recursos JAX-RS que desea proteger utilizando anotaciones para seguridad.

Acerca de esta tarea

Puede proteger los recursos de JAX-RS utilizando anotaciones para la seguridad soportada por JSR 250. Puede utilizar las anotaciones siguientes para añadir semántica de autorización a sus recursos de aplicación JAX-RS:
@PermitAll
Especifica que se permite el acceso de todos los roles de seguridad a los recursos JAX-RS.
@DenyAll
Especifica que no se permite el acceso de ningún rol de seguridad a los recursos JAX-RS.
@RolesAllowed
Especifica los roles de seguridad a los que se permite acceso a los recursos JAX-RS.

Puede optar por anotar en el nivel de clase o en el nivel de método. Las siguientes reglas rigen las anotaciones de seguridad:

Las anotaciones de nivel de método tienen prioridad sobre las anotaciones de nivel de clase.
En el siguiente fragmento de código, el recurso JAX-RS al que hacen referencia las anotaciones @GET y @Path de /addresses y el método correspondiente getList() no está restringido y está abierto para su consumo público. No obstante, el recurso al que hacen referencia las anotaciones @PUT y @Path de /addresses y el método updateList() correspondiente, requiere el rol Manager. Por ejemplo:
@Path(value="/addresses")
@PermitAll
public class AddressBookResource {

  @GET
  @Produces(value="text/plain")
  public String getList() {
  }

  @PUT
  @RolesAllowed(“Manager”)
  public void updateList(String[] books) {
  }
}
Las anotaciones de seguridad se excluyen mutuamente.
Esto significa que cada recurso sólo se rige por como máximo una de las anotaciones de seguridad. Por ejemplo, el ejemplo siguiente no es válido porque se especifican @PermitAll y @RolesAllowed:
@Path(value="/addresses")
@PermitAll
@RolesAllowed(“Employee”)
public class AddressBookResource {

  @GET
  @Produces(value="text/plain")
  public String getList() {
  }
}

En el ejemplo de código anterior, la anotación @RolesAllowed tiene prioridad y la anotación @PermitAll se omite. Del mismo modo, si las dos anotaciones @RolesAllowed y @DenyAll se especifican, la anotación @DenyAll tiene prioridad.

Del mismo modo, si las anotaciones @PermitAll y @DenyAll se especifican a nivel de método o clase, la anotación @DenyAll tiene prioridad ya que garantiza la seguridad haciendo que se cumpla con el principio predeterminado seguro.

Si las anotaciones @PermitAll, @DenyAll y RolesAllowed están todas presentes en el nivel de método o de clase, la anotación @DenyAll tiene prioridad sobre @RolesAllowed y @PermitAll. La lista siguiente muestra el orden de prioridad de estas anotaciones:
  1. @DenyAll
  2. @RolesAllowed
  3. @PermitAll

Regla de herencia
Las anotaciones JSR 250 que se añaden en el nivel de clase sólo afectan a las clases que se anotan y a los métodos correspondientes para subrecursos. Las anotaciones que se especifican en el nivel de clase no afectan a los recursos que se heredan de una superclase.
Regla para la alteración temporal de método(s)
Las anotaciones en los recursos que corresponden a los métodos alterados temporalmente en las subclases tienen prioridad sobre las anotaciones que se incluyen en la clase padre. En el siguiente fragmento, el rol de LocalAdministrator se utiliza para acceder al subrecurso /addresses/local; por ejemplo:
@Path(value="/addresses")
@PermitAll
public class AddressBookResource {

  @GET
  @Produces(value="text/plain")
  public String getList() {
  } 

  @PUT
  @RolesAllowed(“Administrator”)
  public void updateList(String books) {
          
  }
  }

  @Path(value="/addresses")
  @PermitAll
  public class LocalAddressBookResource
               extends AddressBookResource {
         
  @PUT
  @RolesAllowed(“LocalAdministrator”)
  @Path(value=”local”)
  public void updateList(String books){
          
  }
}
Consideraciones sobre @RolesAllowed
No puede tener varias anotaciones @RolesAllowed simultáneamente en un recurso. Por ejemplo, puede obtener:
@RolesAllowed("role1")
@RolesAllowed("role2")
public String foo() {
}
utilizando el siguiente fragmento de código:
@RolesAllowed({"role1", "role2"})
public String foo() {
}
Consideraciones para el uso de anotaciones de seguridad y la configuración de las restricciones de seguridad

Las anotaciones de seguridad siguen el modelo de seguridad declarativa. Las restricciones de seguridad que están configuradas en el descriptor de despliegue, el archivo web.xml, tienen prioridad sobre las restricciones de seguridad que anotan mediante programación en la aplicación. Es importante para los desarrolladores de recursos JAX-RS considerar un equilibrio entre las restricciones de seguridad configurables y las restricciones de seguridad anotadas. Las restricciones anotadas son adicionales a las restricciones de seguridad configuradas. El entorno de ejecución de JAX-RS comprueba las restricciones anotadas después de que el entorno de tiempo de ejecución del contenedor web ha comprobado las restricciones de seguridad que están configuradas en el archivo web.xml.

Configure las restricciones de autenticación en el archivo web.xml. En el archivo web.xml de ejemplo siguiente, se define la restricción de seguridad SecurityConstraint_1. Esta restricción se utiliza para requerir autentificación para la aplicación. Además, la restricción de seguridad de SecurityConstraint_1 define restricciones sobre los patrones de URL correspondientes a recursos JAX-RS. Cuando se accede a un recurso JAX-RS que corresponde a una de estas restricciones, se realizan comprobaciones de autorización. Se llevan a cabo comprobaciones de acceso para las anotaciones de seguridad declarativas sólo después de que se hayan verificado las restricciones configuradas.
<web-app id="WebApp_someID">
  <servlet>
    <servlet-name>AddressBookAppSample</servlet-name>
  <servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
  <init-param>
    <param-name>javax.ws.rs.Application</param-name>
    <param-value>jaxrs.sample.AddressBookApplication</param-value>
   </init-param>
        <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
        <servlet-name>AddressBookApp</servlet-name>
        <url-pattern>/*</url-pattern>
  </servlet-mapping>
  <security-constraint id="SecurityConstraint_1">
    <web-resource-collection id="WebResourceCollection_1">
       <web-resource-name>AddressBookAppSample</web-resource-name>
       <description>Protection area for Rest Servlet</description>
       <url-pattern>/*</url-pattern>
       <http-method>GET</http-method>
       <http-method>POST</http-method>
       <http-method>PUT</http-method>
    </web-resource-collection>
    <auth-constraint id="AuthConstraint_1">
      <description>Role1 for this rest servlet</description>
      <role-name>Role</role-name>
    </auth-constraint> 
    <user-data-constraint id="UserDataConstraint_1">
      <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
    </security-constraint>
    <security-role id="SecurityRole_1">
      <description>This Role is used to drive authentication</description>
      <role-name>Role1</role-name>
    </security-role>  
    <login-config>
      <auth-method>BASIC</auth-method>
      <realm-name>test realm</realm-name>
    </login-config>
</web-app>

En el archivo web.xml del ejemplo anterior, se utiliza Role1 para toda la aplicación. Si está definiendo sólo las anotaciones de seguridad declarativa y no está utilizando las restricciones de autorización del archivo web.xml, puede correlacionar este rol para la aplicación JAX-RS para el sujeto especial AllAuthenticated para la autenticación de usuario.

Procedimiento

  1. Determine si hay restricciones de seguridad definidas por el archivo web.xml para la aplicación JAX-RS.
  2. Configure el archivo web.xml para añadir restricciones de seguridad. Las restricciones de seguridad que están configuradas en el descriptor de despliegue, el archivo web.xml, tienen prioridad sobre las restricciones de seguridad que anotan mediante programación en la aplicación.
  3. Determine si desea agregar anotaciones de seguridad, además de las restricciones en el archivo web.xml. Decida si desea añadir una de las anotaciones @PermitAll, @DenyAll y @RolesAllowed para proporcionar seguridad adicional para los recursos JAX-RS. Considere las reglas para agregar anotaciones de seguridad como la prioridad y la herencia descritas anteriormente.

Resultados

Ha definido recursos JAX-RS seguros mediante anotaciones de seguridad declarativa.

Ejemplo

El siguiente fragmento de código demuestra cómo puede utilizar anotaciones de seguridad para proteger los recursos JAX-RS. En este ejemplo, el recurso root /addresses se asocia con una anotación @PermitAll y por lo tanto, se permite el subrecurso que corresponde a los métodos @GET y @Produces(value="text/plain") a todos los usuarios porque este recurso no introduce anotaciones de seguridad propias. Sin embargo, el subrecurso que corresponde al método @PUT está asociado con su propia anotación @RolesAllowed y requiere el rol Administrator.
@Path(value="/addresses")
@PermitAll
public class AddressBookResource {

  @GET
  @Produces(value="text/plain")
  public String getList() {
  } 

       
  @RolesAllowed(“Administrator”)
  @PUT
  public void updateList(String books) {
          
  }
}

Icon that indicates the type of topic Task topic



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