JSP - Seguridad

JavaServer Pages y servlets ponen a disposición de los desarrolladores web varios mecanismos para proteger las aplicaciones. Los recursos se protegen de forma declarativa identificándolos en el descriptor de implementación de la aplicación y asignándoles un rol.

Hay varios niveles de autenticación disponibles, que van desde la autenticación básica mediante identificadores y contraseñas hasta la autenticación sofisticada mediante certificados.

Autenticación basada en roles

El mecanismo de autenticación en la especificación del servlet utiliza una técnica llamada role-based security. La idea es que en lugar de restringir los recursos a nivel de usuario, cree roles y restrinja los recursos por rol.

Puede definir diferentes roles en el archivo tomcat-users.xml, que se encuentra fuera del directorio de inicio de Tomcat en conf. A continuación se muestra un ejemplo de este archivo:

<?xml version = '1.0' encoding = 'utf-8'?>
<tomcat-users>
   <role rolename = "tomcat"/>
   <role rolename = "role1"/>
   <role rolename = "manager"/>
   <role rolename = "admin"/>
   <user username = "tomcat" password = "tomcat" roles = "tomcat"/>
   <user username = "role1" password = "tomcat" roles = "role1"/>
   <user username = "both" password = "tomcat" roles = "tomcat,role1"/>
   <user username = "admin" password = "secret" roles = "admin,manager"/>
</tomcat-users>

Este archivo define un mapeo simple entre username, passwordy role. Tenga en cuenta que un usuario determinado puede tener múltiples roles; por ejemplo,username = "both" está en el rol "tomcat" y el rol "role1".

Una vez que haya identificado y definido diferentes roles, las restricciones de seguridad basadas en roles se pueden colocar en diferentes recursos de la aplicación web mediante <security-constraint> elemento en web.xml archivo disponible en el directorio WEB-INF.

A continuación se muestra una entrada de muestra en web.xml:

<web-app>
   ...
   <security-constraint>
      <web-resource-collection>
         <web-resource-name>SecuredBookSite</web-resource-name>
         <url-pattern>/secured/*</url-pattern>
         <http-method>GET</http-method>
         <http-method>POST</http-method>
      </web-resource-collection>
      
      <auth-constraint>
         <description>
            Let only managers use this app
         </description>
         <role-name>manager</role-name>
      </auth-constraint>
   </security-constraint>
   
   <security-role>
      <role-name>manager</role-name>
   </security-role>
   
   <login-config>
      <auth-method>BASIC</auth-method>
   </login-config>
   ...
</web-app>

Las entradas anteriores significarían:

  • Cualquier solicitud HTTP GET o POST a una URL que coincida con / secure / * estaría sujeta a la restricción de seguridad.

  • Una persona con el rol de administrador tiene acceso a los recursos seguros.

  • los login-config El elemento se utiliza para describir el BASIC forma de autenticación.

Si intenta navegar por cualquier URL, incluida la /securitydirectorio, se mostrará el siguiente cuadro de diálogo solicitando nombre de usuario y contraseña. Si proporciona un usuario"admin" y contraseña "secret", entonces tendrás acceso a la URL que coincide con /secured/* como hemos definido el administrador de usuario con rol de administrador que tiene permiso para acceder a este recurso.

Autenticación basada en formularios

Cuando utiliza el método de autenticación FORM, debe proporcionar un formulario de inicio de sesión para solicitar al usuario un nombre de usuario y una contraseña. A continuación se muestra un código simple delogin.jsp. Esto ayuda a crear un formulario con el mismo propósito:

<html>
   <body bgcolor = "#ffffff">
      
      <form method = "POST" action ="j_security_check">
         <table border = "0">
            <tr>
               <td>Login</td>
               <td><input type = "text" name="j_username"></td>
            </tr>
            <tr>
               <td>Password</td>
               <td><input type = "password" name="j_password"></td>
            </tr>
         </table>
         <input type = "submit" value = "Login!">
         
      </form>
      
   </body>
</html>

Aquí debe asegurarse de que el formulario de inicio de sesión debe contener los elementos del formulario llamados j_username y j_password. La acción en el<form> la etiqueta debe ser j_security_check. POSTdebe utilizarse como método de formulario. Al mismo tiempo, deberá modificar el<login-config> etiqueta para especificar el método de autenticación como FORM -

<web-app>
   ...
   <security-constraint>
      <web-resource-collection>
         <web-resource-name>SecuredBookSite</web-resource-name>
         <url-pattern>/secured/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
      </web-resource-collection>
      
      <auth-constraint>
         <description>Let only managers use this app</description>
         <role-name>manager</role-name>
      </auth-constraint>
   </security-constraint>
   
   <security-role>
      <role-name>manager</role-name>
   </security-role>
   
   <login-config>
      <auth-method>FORM</auth-method>
      <form-login-config>
         <form-login-page>/login.jsp</form-login-page>
         <form-error-page>/error.jsp</form-error-page>
      </form-login-config>
   </login-config>
   ...
</web-app>

Ahora, cuando intente acceder a cualquier recurso con URL /secured/*, mostrará el formulario anterior solicitando la identificación de usuario y la contraseña. Cuando el contenedor ve el "j_security_check", utiliza algún mecanismo interno para autenticar a la persona que llama.

Si el inicio de sesión se realiza correctamente y la persona que llama está autorizada a acceder al recurso seguro, el contenedor utiliza un identificador de sesión para identificar una sesión de inicio de sesión para la persona que llama a partir de ese momento. El contenedor mantiene la sesión de inicio de sesión con una cookie que contiene el ID de sesión. El servidor envía la cookie al cliente y, siempre que la persona que llama presente esta cookie con las solicitudes posteriores, el contenedor sabrá quién es la persona que llama.

Si el inicio de sesión falla, el servidor devuelve la página identificada por la configuración de página de error de formulario

Aquí, j_security_checkes la acción que las aplicaciones que utilizan el inicio de sesión basado en formulario deben especificar para el formulario de inicio de sesión. De la misma forma, también debería tener un control de entrada de texto llamadoj_username y un password input control llamado j_password. Cuando vea esto, significa que la información contenida en el formulario se enviará al servidor, que verificará el nombre y la contraseña. Cómo se hace esto es específico del servidor.

Consulte Implementaciones de reino estándar para comprender cómoj_security_check funciona para el contenedor Tomcat.

Seguridad programática en un servlet / JSP

los HttpServletRequest El objeto proporciona los siguientes métodos, que se pueden utilizar para extraer información de seguridad en tiempo de ejecución:

S.No. Método y descripción
1

String getAuthType()

los getAuthType() El método devuelve un objeto String que representa el nombre del esquema de autenticación utilizado para proteger el Servlet.

2

boolean isUserInRole(java.lang.String role)

los isUserInRole() El método devuelve un valor booleano: verdadero si el usuario está en el rol dado o falso si no lo está.

3

String getProtocol()

los getProtocol()El método devuelve un objeto String que representa el protocolo que se utilizó para enviar la solicitud. Este valor se puede verificar para determinar si se utilizó un protocolo seguro.

4

boolean isSecure()

los isSecure()El método devuelve un valor booleano que representa si la solicitud se realizó mediante HTTPS. Un valor de verdadero significa que lo fue y la conexión es segura. Un valor de falso significa que la solicitud no fue.

5

Principle getUserPrinciple()

los getUserPrinciple() El método devuelve un objeto java.security.Principle que contiene el nombre del usuario autenticado actual.

Por ejemplo, para una página de JavaServer que enlaza con páginas para administradores, es posible que tenga el siguiente código:

<% if (request.isUserInRole("manager")) { %>
   <a href = "managers/mgrreport.jsp">Manager Report</a>
   <a href = "managers/personnel.jsp">Personnel Records</a>
<% } %>

Al verificar el rol del usuario en un JSP o servlet, puede personalizar la página web para mostrar al usuario solo los elementos a los que puede acceder. Si necesita el nombre de usuario tal como se ingresó en el formulario de autenticación, puede llamar algetRemoteUser método en el objeto de solicitud.