En este post nos encargaremos de la parte de Autenticación.En JEE existen varias formas de autentificarse concretamente BASIC , DIGEST,FORM y CLIENT-CERT . Cada una de las cuales tiene sus peculiaridades .
En este post nos vamos a centrar en la Autenticación de tipo FORM o via formulario que es una de las mas habituales . Para ello necesitaremos crearnos un formulario en el que el usuario introduzca nombre y clave.
Vamos a ver el código fuente del formulario
<html> <span style="font-size: 13px; line-height: 19px;"><head></span> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Pagina de Login</title> </head> <body> <form action="j_security_check" method="POST"> Usuario: <input type="text" name="j_username"/> <br> Contraseña: <input type="password" name="j_password"/> <br> <input type="submit"/> </form> </body> </html>
Como podemos ver este formulario de Autenticación tiene varias cosas peculiares que son definidas por el standard de JAAS .En primer lugar el atributo action tiene que tener el valor j_security_check
<form action="j_security_check" method="POST">
En segundo lugar el campo de usuario tiene que denominarse j_username
Usuario: <input type="text" name="j_username"/>
Por último el campo de clave debe denominarse j_password
Contraseña: <input type="password" name="j_password"/>
Realizadas estas operaciones ya tendremos el formulario correctamente construido. Una vez hecho esto damos de alta el formulario en el fichero web.xml para configurar la autenticación.
<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>
Una vez hecho esto nos queda generar la pagina error.jsp para los casos en los que el usuario no se autentique de forma correcta.Vamos a ver su código:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv=<em>"Content-Type"</em> content=<em>"text/html; charset=UTF-8"</em>> <title>Pagina de Error</title> </head> <body> No tienes permisos para acceder </body> </html>
Una vez realizada esta operación vamos a mostrar la estructura de ficheros que tenemos en la aplicación
Como podemos ver tenemos los ficheros de login.jsp y de error.jsp mas el fichero web.xml . Aparte de estos ficheros hemos creado dos carpetas recursosRoleA y recursosRoleB. Las cuales incluyen las siguientes páginas jsp.
El contenido de los ficheros HolaRoleA. jsp y HolaRoleB.jsp es muy similar y simplemente vamos a mostrar el de uno de los dos.
<%@ page language=<em>"java"</em> contentType=<em>"text/html; charset=UTF-8"</em> pageEncoding=<em>"UTF-8"</em>%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv=<em>"Content-Type"</em> content=<em>"text/html; charset=UTF-8"</em>> <title>Acceso</title> </head> <body> Bienvenido RoleA </body> </html>
Una vez construidos estos ficheros hemos finalizado practicamente la configuración a nivel de JAAS .Sin embargo en el post anterior se nos olvido dar de alta los Roles a nivel general en el web.xml .
<pre><security-role> <role-name>ROLEA</role-name> </security-role> <security-role> <role-name>ROLEB</role-name> </security-role></pre>
Por ello mostramos a continuación el contenido del fichero web.xml con el código que faltaba.
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-app_2_4.xsd" version="2.4"> <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> <security-role> <role-name>ROLEA</role-name> </security-role> <security-role> <role-name>ROLEB</role-name> </security-role> <security-constraint> <web-resource-collection> <web-resource-name>recursosRoleA</web-resource-name> <url-pattern> /recursosRoleA/* </url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>ROLEA</role-name> </auth-constraint> </security-constraint> <security-constraint> <web-resource-collection> <web-resource-name>recursosRoleB</web-resource-name> <url-pattern> /recursosRoleB/* </url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>ROLEB</role-name> </auth-constraint> </security-constraint> </web-app>
La siguiente imagen resume la relación existente entre el web.xml y los distintos ficheros de la aplicación.
Aunque hemos avanzado bastante todavia nos queda asociar la configuración de JAAS a un repositorio de usuarios esto lo cubriremos en el proximo post.
Excelente me saco de un apuro, gracias!!!.
de nada 🙂
Padrisimo le entendi a todo, Gracias
gracias 🙂
Ola ingeniero, muchas gracias por tus aportes, quería saber si finalmente publicaste algún post con la información de como asociar JAAS a un repositorio de usuarios?
No creo que no tengo nada en concreto de eso publicado ya lo siento.
[…] artículos relacionados:JAAS y Seguridad , JAAS y Seguridad II , Provedores de […]
Ingeniero muchas gracias por publicar estos tipos de Post que de verdad sirven para aclarar bastante cosas, yo estoy realizando una aplicación donde tengo 5 tipos de Usuario (Administrador,Secretaria,Contador,Analista y agente de compra-venta), quisiera preguntarte y saber si estoy realizando lo correcto, yo cree los crud de las diferentes tablas de mi BD en el IDE Netbeans, es necesario para efectos de Autenticación y Autorización, agrupar por los diferentes tipos de roles, los archivos del crud de cada tabla ?? Gracias amigo, muchos éxitos
me alegro que te haya sido util 🙂
Cecilio, ha sido útil pero he montado una aplicación y no se como enlazarla a una clase java. Y la estructura de directorios donde tengo que declarar cada cosa no la tengo clara.
Le agradecería si me echa una mano.
Gracias.
Saludos,
javier
Uff son muchas preguntas 🙂 , se un poco más especifico