Anotaciones dinámicas de seguridad de servlet
Cuando se utilizan las API de programación para añadir o crear un servlet, las anotaciones de seguridad RunAs, declareRoles y ServletSecurity, se pueden actualizar dinámicamente mediante los métodos setRunAsRole(), declareRoles() y setServletSecurity() respectivamente.
Cuando se inicia una aplicación, el contenedor web inspecciona todos los servlets con las anotaciones RunAs, declareRoles y ServletSecurity y establece estas anotaciones en el método setServletSecurity() de la anotación ServletRegistration. El contenedor web 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 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 dinámicos.

Si tiene una coincidencia de patrón de URL exacta en la anotación ServletSecurity de la anotación dinámica de seguridad, tendrá prioridad la restricción de seguridad del patrón de URL en la anotación dinámica de seguridad. Asimismo, si llama al método setServletSecurity() varias veces con el mismo patrón de URL, el último tiene prioridad.
- ServletRegistration.Dynamic.setRunAsRole(String roleName) establece el nombre del rol RunAS para este registro de servlet.
- ServletContext.declareRoles(String roleNames) declara los nombres de rol que se prueban para el método isUserInRole().
- ServletRegistration.Dynmaic.setServletSecurity(ServletSecurityElement constraint) establece ServletSecurityElement para este registro de servlet.
Los dos ejemplos siguientes se pueden utilizar para establecer las restricciones de seguridad y el rol RunAs para servlets dinámicos utilizando el método setServletSecurity().
HttpConstraintElement constraint = new HttpConstraintElement(TransportGuarantee.NONE,
new String[]{"Employee"});
List<HttpMethodConstraintElement> methodConstraints =
new ArrayList<HttpMethodConstraintElement>();
methodConstraints.add(new HttpMethodConstraintElement("PUT",
new HttpConstraintElement(TransportGuarantee.CONFIDENTIAL, new String[]{"Manager"})));
ServletSecurityElement servletSecurity =
new ServletSecurityElement(constraint, methodConstraints);
HttpConstraintElement constraint = new HttpConstraintElement();
List<HttpMethodConstraintElement> methodConstraints =
new ArrayList<HttpMethodConstraintElement>();
methodConstraints.add(new HttpMethodConstraintElement("CUSTOM",
new HttpConstraintElement(TransportGuarantee.NONE, new String[]{"Manager"})));
methodConstraints.add(new HttpMethodConstraintElement("GET",
new HttpConstraintElement(TransportGuarantee.CONFIDENTIAL, new String[]{"Employee"})));
ServletSecurityElement servletSecurity = new ServletSecurityElement(constraint,
methodConstraints);