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
- @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:- @DenyAll
- @RolesAllowed
- @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:
mediante el fragmento de código siguiente:@RolesAllowed("role1") @RolesAllowed("role2") public String foo() { }
@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
- Determine si hay restricciones de seguridad definidas por el archivo web.xml para la aplicación JAX-RS.
- 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.
- 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
@Path(value="/addresses")
@PermitAll
public class AddressBookResource {
@GET
@Produces(value="text/plain")
public String getList() {
}
@RolesAllowed(“Administrator”)
@PUT
public void updateList(String books) {
}
}