Protección de recursos JAX-RS utilizando anotaciones

Puede proteger los recursos JAX-RS (API Java™ para servicios web RESTful) utilizando anotaciones que especifiquen valores de seguridad.

Antes de empezar

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

Acerca de esta tarea

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

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

Las anotaciones de nivel de método tienen prioridad sobre las anotaciones en el nivel de clase.
En el siguiente fragmento de código, el recurso JAX-RS al que se hace referencia mediante la anotación @GET y la anotación @PATH de /addresses y el método correspondiente getList() no está restringido ni abierto para consumo público. Sin embargo, el recurso al que hacen referencia las anotaciones @PUT y @Path de /addresses y el método updateList() correspondiente requiere el rol de Manager; por ejemplo:
@Path(value="/addresses")
        @PermitAll
        public class AddressBookResource {

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

          @PUT
          @RolesAllowed(“Manager”)
          to public void updateList(String[] books) {
          }
        }
Las anotaciones de seguridad se excluyen mutuamente.
Esto significa que cada recurso sólo se rige como máximo por una de las anotaciones de seguridad. Por ejemplo, el ejemplo siguiente no es válido porque se especifica tanto @PermitAll como @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 ignora. De forma similar, si las dos anotaciones @RolesAllowed y @DenyAll se especifican, la anotación @DenyAll tiene prioridad.

De forma similar, si la 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 clase, la anotación @DenyAll tiene prioridad sobre @RolesAllowed y @PermitAll. El orden de precedencia de estas anotaciones es el siguiente:
  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 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:
       s@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){  
          
          }
        }
Consideración sobre @RolesAllowed
No puede tener varias anotaciones @RolesAllowed simultáneamente en un recurso. Por ejemplo, puede conseguir:
  @RolesAllowed("role1")
   @RolesAllowed("role2")
    public String foo() {
    }
mediante el fragmento de código siguiente:
 @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>
       org.apache.wink.server.internal.servlet.RestServlet
  </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>
    </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_securejaxrs_annotations
File name: twbs_jaxrs_impl_securejaxrs_annotations.html