miércoles, 25 de junio de 2014

Weblogic 11G: ejemplo de autentificación por formulario contra Directorio Activo de Microsoft

En esta primera entrada lo que voy a hacer es montar una aplicación web con autentificación por formulario contra un Directorio Activo (AD) de Microsoft. Utilizaremos seguridad declarativa para limitar el acceso a los recursos de la aplicación web.

El nivel funcional del dominio será Windows Server 2003, el servidor sobre el que montare la aplicación web será Oracle Weblogic 11G y como entorno de desarrollo utilizaré el IDE Eclipse.

Necesitaremos tener ya instalado y funcionando los tres. La ubicación es indiferente, solo necesitamos tener conexión de un servidor en otro.

El motivo de utilizar el AD en Windows 2003 es que ya lo tengo montado en una maquina virtual aparte; en principio, todo seria igual en un dominio con un nivel funcional mas actual.

Configuración Active Directory

Entramos en nuestro servidor de dominio y en la consola de administración de AD creamos una Unidad Organizativa (OU) para los grupos que utilizare en la gestión de la seguridad de las diferentes aplicaciones:


















Utilizaremos 2 grupos y 3 usuarios para probar los diferentes roles dentro de la aplicación web:
  • grupo APLIC_ACCESO_PPAL: usuarios prueba1 y prueba2
  • grupo APLIC_EXTRANET: usuarios prueba1 y prueba3
Los usuarios los mantendremos en la OU por defecto "Users":


















Configuración Weblogic

En la consola de Weblogic vamos a la ruta Dominios de Seguridad / myrealm / Proveedores, pulsamos "Nuevo" y completamos el nombre del nuevo proveedor de seguridad y elegimos en tipo "Active Directory Authenticator":


















Ahora vamos a configurar este nuevo proveedor:


















Pulsamos en "Volver a Ordenar" y lo ponemos el primero de la lista:


















Tiene que quedar así:


















Ahora seleccionamos el proveedor "CDLLocalAD" y en la pestaña "Común" ponemos como Indicador de Control "SUFFICENT":
















De esta forma bastará que la validación en el AD sea correcta para que el acceso se conceda.

En la pestaña "Proveedor Especifico" pondremos los siguientes valores:
  • Host: 192.168.1.20 (la IP del servidor de dominio de nuestro AD)
  • Puesto: 389 (puerto por defecto LDAP)
  • Principal: Administrator@cdl.local (usuario Administrador del dominio)
  • Credencial: contraseña del usuario anterior en el dominio
  • Confirmar Credencial: confirmación de la contraseña
  • DN Base de Usuario: CN=Users,DC=cdl,DC=local
  • Filtro de Nombre de Usuario: (&(userPrincipalName=%u)(objectclass=user))
  • Atributo de Nombre de Usuario: userPrincipalName
  • DN Base de Grupo: OU=Aplicaciones,DC=cdl,DC=local
Los demás valores los dejamos por defecto. Hay que destacar dos puntos:
  1. El DN Base de Usuario no es OU=Users,DC=cdl,DC=local; asi no funciona porque estamos utilizando el contenedor por defecto de usuarios del AD.
  2. Utilizamos como Atributo de Nombre de Usuario el userPrincipalName y no el "cn", Common Name; podemos elegir el atributo del objeto user del AD que queramos, pero este sera el que luego utilizaremos al hacer login en las aplicaciones.
Llegados a este punto hay que reiniciar el servidor de Weblogic para continuar.

Una vez reiniciado, en la consola de Weblogic vamos a la ruta Dominios de Seguridad / myrealm / Usuarios y Grupos y comprobamos que en las dos pestañas vemos la información de las OUs del AD:

















    Ya tenemos terminada la parte correspondiente a Weblogic y AD; ahora solo tenemos que crear la aplicación y desplegarla.

    Creación de la aplicación web

    Vamos a utilizar la aplicación de ejemplo de los tutoriales de Java, pero incluiré el código por si alguien no dispone de él.

    En Eclipse creamos un nuevo proyecto Web Dinámico llamado "FormBasedApp" con la siguiente estructura y ficheros:


















    El directorio "protected" es el recurso cuyo acceso queremos restringir.

    La pagina por defecto, "welcome.jsp", tendrá solamente un link a una página contenida en el directorio (recurso) que queremos proteger:

    <html>
    <body>
    <center><h1> Welcome Page </h1>
    <h3><font color=maroon><a href="protected/protected.jsp">Access Protected Resource</a></font></h3>
    </center>
    </body>
    </html>

    La página "login.jsp" es el formulario que se presentara para introducir el usuario y la contraseña:

    <html>
    <head>
    <title>FormBased Authentication Demo in WebLogic Sample</title>
    </head>
    <body>
    <center>
    <h2>Please Enter Your UserName & Password (FormBased Auth Example)</h2>
    <form method="GET" action="j_security_check">
    <table border=5%>
    <tr><td>Username:</td><td><input type="text" name="j_username"></td></tr>
    <tr><td>Password:</td><td><input type="password" name="j_password"></td></tr>
    <tr><td colspan=2 align=right><input type=submit value="Submit"></td></tr>
    </table>
    </form>
    </center>
    </body>
    </html>

    No existe un link a login.jsp desde ninguna página; al configurar la seguridad en el fichero web.xml se indica que es este el formulario que se mostrara al intentar acceder al contenido protegido.

    Hay que mantener la nomenclatura de j_security_check, j_username y j_password, marcadas en negrita en el código anterior para que todo funcione, es el estandar de Java el que lo establece así.

    La página "failedlogin.html" solo muestra un mensaje en caso de que la validación haya resultado erronéa:

    <html>
    <body>
    <center> <h1><font color=red>SORRY!!!</font> U are Not Authorized To Access The Resources.
    <BR>
    Please Login With valid Credentials.</h1>
    </center>
    </body>
    </html>

    La pagina "protected,jsp" muestra un mensaje de bienvenida, el nombre de usuario y los roles de la aplicación a los que pertenece dicho usuario:

    <html>
    <head>
    </head>
    <body>
    <center><h1> Protected Page </h1>
    <b><font color=maroon>Congrates!!! Your Login Is Successful...U are able to access the Secure Page.</font></b><BR>
    __________________________***_________________________

    <%String name = request.getUserPrincipal().getName();%>
    <br>Tu nombre es: <%=name %></br>
    <%if (request.isUserInRole("admin")) {%>
    <br>Tu rol es: admin</br>
    <%}%>
    <%if (request.isUserInRole("normal")) {%>
    <br>Tu rol es: normal</br>
    <%}%>

    </center>
    </body>
    </html>

    En el fichero "weblogic.xml" mapeamos los roles de la aplicación con los grupos y usuarios del AD:

    <?xml version="1.0" encoding="UTF-8"?>
    <wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.3/weblogic-web-app.xsd">
        <wls:weblogic-version>10.3.6</wls:weblogic-version>
        <wls:context-root>FormBasedApp</wls:context-root>
        <wls:security-role-assignment>
            <wls:role-name>admin</wls:role-name>
            <wls:principal-name>APLIC_ACCESO_PPAL</wls:principal-name>
            <wls:principal-name>Administrator</wls:principal-name>
        </wls:security-role-assignment>
        <wls:security-role-assignment>
            <wls:role-name>normal</wls:role-name>
            <wls:principal-name>APLIC_EXTRANET</wls:principal-name>
            <wls:principal-name>Administrator</wls:principal-name>
        </wls:security-role-assignment>
    </wls:weblogic-web-app>

    En este caso hemos creado dos roles:
    • admin: mapeado al grupo APLIC_ACCESO_PPAL y al usuario Administrator.
    • normal: mapeado al grupo APLIC_EXTRANET y al usuario Administrator.
    Con esta configuración el usuario prueba1 tendrá los dos roles, el usuario prueba2 el rol "admin" y el usuario prueba3 el rol "normal".

    Y por último, en el fichero "web.xml" configuramos la seguridad de nuestra aplicación:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
      <display-name>FormBasedApp</display-name>
      <welcome-file-list>
       <welcome-file>welcome.jsp</welcome-file>
      </welcome-file-list>

    <security-constraint>
    <display-name>Constraint-0</display-name>
    <web-resource-collection>
    <web-resource-name>Constraint-0</web-resource-name>
    <url-pattern>protected/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
    <role-name>admin</role-name>
    <role-name>normal</role-name>
    </auth-constraint>
    <user-data-constraint>
    <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
    </security-constraint>

    <login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
    <form-login-page>/login.jsp</form-login-page>
    <form-error-page>/failedlogin.html</form-error-page>
    </form-login-config>
    </login-config>

     <security-role>
    <role-name>admin</role-name>
     </security-role>
     <security-role>
    <role-name>normal</role-name>
     </security-role>

    </web-app>

    Aquí indicamos la página por defecto (welcome.jsp), los roles de la aplicación (admin y normal), el método de autentificación (FORM), la página que se mostrara al intentar acceder a contenido protegido (login.jsp) y la política de seguridad que en este caso consiste, solamente, en restringir el acceso al directorio "protected".

    Generamos el fichero war en Eclipse y desplegamos la aplicación en Weblogic.

    Prueba de la aplicación

    Accedemos a nuestra aplicación, por ejemplo, desde la pestaña de Testing de la aplicación desplegada en Weblogic:

















    Accedemos al link con el contenido protegido y nos redirige automáticamente al formulario de login:

















    Si introducimos un usuario y/o contraseña errónea o un usuario que no tiene permiso para acceder al recurso protegido nos mostrará la pagina failedlogin.html:

















    Si introducimos un usuario y contraseña válidos nos mostrará la página protegida:

















    Con esto hemos terminado, espero que le sea de utilidad a alguien.

    Hasta otra.

    2 comentarios:

    1. Hola, bueno el articulo

      consulta: en el Archivo weblogic.xml ¿porque aparece 2 etiquetas con el mismos nombre ? "wls:principal-name"


      normal
      APLIC_EXTRANET
      Normal
      </wls:security-role-assignment

      ResponderEliminar
      Respuestas
      1. Hola, perdona que no te haya respondido antes pero tengo el blog un poco abandonado ...

        Hay que poner una etiqueta "principal-name" por cada elemento que tendrá el rol de aplicación; en el ejemplo son dos: el grupo de AD de nombre "APLIC_ACCESO_PPAL" y el usuario de AD "Administrator".

        Si hubiese otros usuarios o grupos con ese rol tendriamos que añadir las lineas correspondientes.

        Espero que esto te lo aclare.

        Un saludo

        Eliminar