Fluid Attacks logo
Contact Us
Young hacker smiling
Zero false positives

Expert intelligence + effective automation

Contact logo Contact Us
GET A DEMO

Configurar Autorización para Servlets Programando

Necesidad

Autorización para Servlets usando programación en Java

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se dispone de un servidor de aplicaciones o contenedor de Servlets conforme con las especificaciones empresariales de Java que soporte la especificación 3.0 o superior.

Solución

  1. Inicialmente se configuran los usuarios que tendrán acceso a la aplicación. Este paso dependerá del contenedor de servlets que se esté usando y de la fuente de donde se extraigan los datos.

  2. Por ejemplo en Tomcat, y tomando como usuarios los definidos para el propio servidor, se deberá agregar en el archivo tomcatusers.xml usuarios con roles específicos, por ejemplo:

    tomcatusers.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <tomcat-users>
      <role rolename="tomcat"/>
      <role rolename="rol1"/>
      <role rolename="rol2"/>
      <user username="usuario1" password="clave1" roles="rol1"/>
      <user username="usuario2" password="clave2" roles="rol1,rol2"/>
      <user username="tomcat" password="tomcat" roles="tomcat"/>
      <user username="fsg" password="Flu-1.D/" roles="tomcat"/>
    </tomcat-users>
    
  3. Para autenticar los usuarios usando programación, la especificación Servlet 3.0 especifica los siguientes métodos de la interfaz HttpServletRequest:

    • login, el cual permite a una aplicación recoger un usuario y una contraseña como alternativa al tener que especificar una autenticación basada en formularios en el descriptor de despliegue.

    • logout, el cual permite a una aplicación reiniciar el identificador de quien hace la petición.

  4. A continuación se muestra un ejemplo de como usar los métodos. La estructura de carpetas que debe tener la aplicación es:

    1
    2
    3
    % ls -R *
    src/test:
    TestLogin.java
    
  5. Se crea el servlet TestLogin.java, configurando mediante anotaciones cuáles serán los roles permitidos.

  6. Primero, se especifica que pertenece al paquete test y se importan las clases necesarias para trabajar con servlets HTTP.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    package test;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import avax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
  7. Se especifica que el servlet se llamará TestServlet y que la URL que mapea a este será /TestServlet.

    1
    @WebServlet("/TestLogin")
    
  8. Se crea un servlet típico.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class TestLogin extends HttpServlet {
      public TestLogin() {
        super();
      }
    
      protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
          PrintWriter out = response.getWriter();
          response.setContentType("text/html;charset=UTF-8");
    
  9. Se obtienen los parámetros user y pass pasados usando el método GET.

    1
    2
    String user = request.getParameter("user");
    String pass = request.getParameter("pass");
    
  10. Se hace un login a nivel de programación y se muestra el mensaje Login exitoso en caso de una autenticación válida. En caso contrario, se lanzará una excepción y se mostrará el mensaje Login fallido. En cualquiera de los dos casos se borrará el identificador de quien hizo la petición.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
       try {
         request.login(user, pass);
         out.println("Login exitoso");
       }
       catch (Exception e) {
         //throw new ServletException(e);
         out.println("Login fallido");
       }
       finally {
         request.logout();
         out.close();
       }
     }
    }
    
  11. Para probar la aplicación, luego de hacer el despliegue se deben pasar por GET los parámetros user y pass:

  12. En su aplicación debe evitar usar el método GET para el servlet de autenticación, y en su lugar utilizar el método POST, esto es con el fin de evitar que las credenciales de sus usuarios queden almacenadas en la bitácora del servidor y en el historial de navegación.

Descargas

Puedes descargar el código fuente pulsando en el siguiente enlace:

TestLogin.java Servlet que muestra como configurar la autorización mediante el uso de servlets.


Service status - Terms of Use