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
- @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:- @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 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:
utilizando el siguiente fragmento de código:@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>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
- 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) {
}
}