Uno de los temas que el libro no ha incluido es el tema de seguridad . Vamos en los próximos post ha realizar una pequeña introducción a como securizar una aplicación JEE usando el estándar de JAAS (Java Authentication and Authorization Service). Supongamos que un usuario desea controlar el acceso a unos recursos.
Normalmente ante este situación se pasa por dos fases la fase de Autenticación y la fase de Autorización.
En la fase de Autenticación el usuario envia al servidor su nombre y su password y el servidor comprueba contra algún tipo de repositorio si el usuario es válido o no.Una vez que el usuario ha sido validado pasamos la segunda fase que es la fase de Autorización en la que se comprueba que el usuario tiene permisos para acceder a estos recursos.
Ahora bien en el standard de JAAS la fase de Autorización esta ligada a la gestión de roles . Es decir para que no tengamos que asignar permisos a los recursos para cada usuario individualmente se realiza un mapeo entre usuarios y roles .De tal forma que un conjunto de usuarios comparten un mismo ROL.
Una vez que tenemos claro el concepto de ROL . JAAS se encarga de definir cuales son los recursos a los que cada usuario a traves del ROL o ROLES que disponga puede acceder.
Vamos a ver a continuación como el standard JAAS se encarga de definir los recursos y roles necesarios para una aplicación web. Para ello deberemos modificar el fichero web.xml y añadirle etiquetas de seguridad.
<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″>
<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>
</webapp>
Como podemos ver estamos definiendo dos restricciones de seguridad de acceso a recursos una denomina recursosRoleA y otra denominada recursosRoleB . La etiqueta de <url-pattern>define que recursos son protegidos y la etiqueta <role-name> que roles tienen acceso a ellos. Una vez realizada esta operación habremos terminado la fase de Autorización en el siguiente post cubriremos la parte de Autentificación.
hola cecilio la verdad eh visto muchos post y comentarios y me sorprende todo tu conocimiento si me podrias orientar en leer algo algun libro o tutoriales para entender mas sobre sistemas webs. estoy estudiando ing. en sistemas ya a un año de salir y me gustaria dedicarme a esto pero necesito unas bases mas fuertes de los que tengo en conocimientos respecto a esto. Te lo agradeceria mucho
Es una pregunta interesante pero no conozco ningún libro concreto que revisa las arquitecturas web por completo 🙁
[…] hemos usado JAAS y el fichero web.xml para configurar la seguridad en una aplicación web Java. A partir de Servlets 3.0 podemos […]
Buenos dias, primero que todo es un post muy interesante, ya logre crear roles y mapearlos, peor mi duda es que cuando un rol no tiene permiso a una pagina sale un error 403 que dice prohibido(lineas azules), se podria poner un faces xhtml como pagina de error para este caso ( porque para la parte del login del realm si deja porner un error.xhtml por si el usuario o la clave no es correcta) agradesco su respuesta buen dia =)
Si has usado JAAS lo logico es que controles la gestión de errores desde JAAS tambien . Se puede configurar una página de error a nivel de web.xml 🙂
buenas, necesito hacer esto pero para autorizar a un grupo de usuarios para que puedan acceder a 1 pagina del grupo admin que ya tengo definido, sin tener que organizar en carpetas para cada grupo de usuarios.
como lo podría hacer???????.
Depende con lo que estes pero en muchos casos te puedes apoyar en la anotacion de EJBs de @RunAs que permite ejecutar una funcionalidad con otro rol al asignado
gracias por responderme,
en esta imagen se ve lo que quiero hacer:
quiero autorizar al grupo invitado para ver solamente una pagina llamada “listado.xhtml” dentro de la carpeta donde el grupo admin puede ver todas las paginas, no puedo hacerlo por carpetas asi como lo haces tu porque tengo un login y de ese login pasa a la pagina llamada “principal” donde estan todos los links para dirigir a las paginas que estan dentro de la carpeta “solicitud”.
Uff eso igual si es más complicado ya que normalmente cada carpeta va asignada a un grupo de roles y punto. Yo intentaría hacer un mapeo concreto para ese fichero a nivel de web.xml. Es decir algo asi como /carpeta/mifichero–>y asignar role de invitado y rol de administrador. Pero no lo he probado 🙂
Hola cecilio tengo una pregunta que me gustaría saber si pudieras aclararmela. Yo manejo la seguridad con roles y EL con el framework que uso, ahora si por ejemplo tengo el rol de vendedor pero me se el url de un .jsp que imprime un reporte que solo el rol de gerente puede generar y la ingreso en el omnibox puedo acceder. Como hago para que esto no suceda y así le pase el url directamente después de logueado no me lo permita porque no tengo ese rol? Gracias de antemano Cecilio.
no debiera dejarte si tienes los roles bien puestos en el web.xml.
Hola Cecilio, tengo el siguiente dilema en mi proyecto en struts de acuerdo a: $security-constraint> $display-name>Regla 1$/display-name> $web-resource-collection> $web-resource-name>Area segura$/web-resource-name> $url-pattern>*.do$/url-pattern> $url-pattern>*.jsp$/url-pattern> $/web-resource-collection> $auth-constraint> $role-name>roladm$/role-name> $/auth-constraint> $/security-constraint> $security-constraint> $display-name>Regla 2$/display-name> $web-resource-collection> $web-resource-name>Area acceso libre$/web-resource-name> $url-pattern>/todousuario$/url-pattern> $/web-resource-collection> $/security-constraint> lo que necesito saber es que si puedo acceder de forma libre (sin solicitar acceso de usuario y contraseña) a los archivos de la carpeta “todousuario” que se encuentra dentro del mismo proyecto. Lo anterior lo probé y no funciona. En el caso de que si se pueda acceder de alguna forma, ¿estos pueden utilizar los metodos del proyecto (action, form, dao, vo,… Read more »
por lo que veo has protegido un recurso. Pero no has dado acceso a nadie a él. Si quieres que un recurso este accesible por todos. Simplemente no le pongas en el web.xml 😉 y lo estará.
Buen dia ; Estoy investigando un poco si existe la posibilidad de crear un sistema para autenticar y autorizar grupos de usuarios de forma semi-automatica mediante JAAS o Realm, soy novato en el tema y lo que intento hacer es: *Proteger los recursos URI mediante un sistema de autenticacion ( actualmente he configurado web.xml algo parecido a tu ejemplo con para cumplir este requerimiento ) y la verdad lo hace bastante bien puedo proteger un conjunto de recursos. El asunto es este : Para ingresar a mi webapp el usuario deberá logearse a la aplicacion mediante un sistema de autenticacion… Read more »
creo que te acabo de contestar por correo 🙂 si no eras tu comentamelo 😉
Buenos días,
Yo quisiera conocer las dos opciones que ustedes plantean:
1) Autenticar mediante JAAS con los parámetros: Nombre de usuario, Clave y Rol.
2) Autenticar mediante JAAS con solo el Nombre de usuario y la clave para tener acceso a los distintos roles que el usuario posea.
Gracias.
No funciona así .Siempre se autentifica un usuario a traves de su nombre y clave. Luego el sistema le asigna un ROL y a partir de ahí a traves de programación le permites acceder a unas zonas u otras.
Hola Cecilio, como se pueden hacer estas autorizaciones de forma dinámica, ponerlo en el web.xml es muy rígido y en la mayoría de los casos no tengo una lista de páginas para el rol A y otra para el rol B con URIs tan definidas como en tu ejemplo.
Según lo que explicás, supongo que el web.xml va creciendo a medida que crecen la cantidad de páginas, no?
Se suele asignar grupo de URLs a bloque tipo /modulo1/* .Si quieres tener un mayor control de los roles podrías usar expresion language dependiendo del framework en cada pagina . Por ejemplo para que una pagina se muestre de una forma u otra dependiendo del rol.
security-constraint>
web-resource-collection>
web-resource-name>Public
url-pattern>/prestadores/capturaSolicitudProveedor.seam
url-pattern>/css/*
url-pattern>/js/*
web-resource-collection>
security-constraint>
aunque tengas las urls accesibles mira a ver como seam las referencia
buenos días, tengo una situación donde es necesario permitir el acceso a unas paginas especificas sin necesidad de login, al crear este grupo de paginas y obtener un el acceso sucede que se pierde las validaciones de js para campos. ¿cuál seria la forma correcta de hacer esto?.
segmento de web.xml
Public
/path-to-free-site.seam
no deberian perderse algo se te esta escapando .Comprueba que los ficheros js en donde se encuentran las validaciones siguen siendo accesibles y son correctamente cargados por el navegador
tengo que hacer una aplicación que después de un login, te lleve a una ventana con unas opciones, que cambiarán según el tipo de usuario que se loguee, (Administrador, gerente, usuario normal), ya he creado el diálogo de Login y conectado a la base de datos, pero no sé cómo se hace para que:
1.Java distinga que es un usuario admin, gerente o normal.
2.Te lleve a una ventana distinta según el tipo..
Si me pudieran ayudar estaría muy agradecido, ya que ando bastante perdido…
Gracias!
Buenas
Hay varias maneras de hacerlo pero todas se basan en el método isUserInRole de httpServletRequest . Con este método en un JSP ,en un servlet o en un comando puedes redireccionar a la pagina que cada rol necesita
Espero te sea util 🙂
Si anotamos:
GET
POST
Según leo en las especificaciones de Servlet 3.0, permitimos todos los métodos excepto GET y POST, (si es que entendí bien).
Según anotas en el ejemplo:
GET
POST
¿Provocaría esto todo lo contrario? ¿Excluye todos excepto GET y POST?
Sustituyo símbolo “mayor que” y “menor que” por asterisco. No se pueden postear.
*http-method-exception* GET */http-method-exception*
*http-method-exception*POST*/http-method-exception*
*http-method*GET*/http-method*
*http-method*POST*/http-method*
Por defecto se excluye todo . Salvo los que tu des de alta