Una era construye ciudades. Una hora las destruye.
Séneca

[Struts] – Control de Acceso

El problema del control de acceso dentro de una aplicación web es habitual en las aplicaciones web. Es muy habitual comprobar que existe un objeto usuario en sesión, es decir, que el usuario se ha identificado correctamente en la aplicación y la sesión no está caducada. Y también es habitual comprobar que el usuario tiene privilegios para acceder a determinadas zonas.

Existen varias soluciones ya implementadas y fácilmente personalizadas para no obligarnos a implementar una solución propia para este problema. 

Tomcat, una solución sencilla 

Una forma de resolver fácilmente este problema es como se ha visto en otro post anterior, "Control de acceso a una aplicación web", delegando en Tomcat la resolución de este problema. Esta solución es una buena primera aproximación para una aplicación simple, pero resulta en general poco práctica como solución profesional.

Roles en Struts 

El problema de la solución anterior es su mantenimiento. En general, tanto los usuarios como sus roles varían en el tiempo, y suelen ser mantenidos con los demás datos de los usuarios.

Struts nos ofrece una solución sencilla.

En el fichero struts-config.xml, uno de los atributos que podemos declarar en nuestros elementos action es roles, que contiene la lista de los roles permitidos para acceder a dicho action.

El control de acceso, es decir, verificar que el usuario posee un rol de la lista de roles permitidos, lo realiza el método processRoles de la clase del framework de Struts org.apache.struts.action.RequestProcessor. Si queremos realizar alguna comprobación más personalizada podemos extender esta clase y sobreescribir el método.

Para declarar en el struts-config.xml nuestra clase extendida como controlador para que se utilice en lugar de la clase habitual de struts. Si hemos llamado a nuestra clase com.lycka.util.CustomRequestProcessor:

<controller>
   <set-property property="processorClass"
   value="com.lycka.util.CustomRequestProcessor"/>
</controller>

Existe el usuario en sesión ? 

Si necesitamos algo más sencillo, como únicamente comprobar que existe un objeto usuario en sesión diferente de null para permitir continuar o redirigir a una pantalla de error, podemos añadir esta comprobación en el método processPreprocess de la misma clase org.apache.struts.action.RequestProcessor.

Enlaces

Extending Struts 

Lyckapedia 

[tags]roles, struts, control acceso[/tags]

9 Comentarios hasta el momento »

  1. paulina dijo

    11 de October del 2007 a las 7:44 pm

    Hola, esta bueno tu articulo, pero tengo una duda, yo estoy autenticando usando jaas en mi aplicacion y la restriccion de roles la hago simplemente con struts-menu; mi problema es que no se de que forma setear el rol de mi usuario en la aplicacion de forma que esta pueda reconocer este rol durante el resto de la sesion? si pudieras ayudarme seria genial.
    Saludos,
    Paulina

  2. yoyoooyoy dijo

    16 de October del 2007 a las 11:20 pm

    Encantado de que te guste el artículo paulina,

    acabo de llegar de viaje, mañana te contesto si puedo.

    ciao

  3. yoyoooyoy dijo

    17 de October del 2007 a las 1:05 pm

    Vale, aunque toy enfermito y con curro para aburrir, a ver si te sirve esta respuesta. No sé si te he entendido bien la pregunta, y no sé si te servirá.

    Echa un vistazo aquí, http://www.jaasbook.com/ sobre jaas, que tiene un ejemplo parecido.

    Los roles de los usuarios se suelen definir en un archivo (tipo tomcat-users.xml) o en una base de datos, como cualquier otro atributo de tu objeto usuario.

    Luego, el módulo de login de tu aplicación comprueba si tu login-passwords son correctos, y si lo son, se deja tu objeto Usuario en la sesión hasta que abandones la aplicación (tu modulo de logout deberá de eliminar ese objeto de sesión) o se caduque.

    Así, cada vez que quieras en la aplicación obtener un dato de tu usuario, como el nombre, el mail, o sus roles, puedes obtenerlo de la sesión.

  4. Lycka Bonita » Blog Archive » [Struts] - Realizar una acción común en todos los action dijo

    23 de February del 2008 a las 1:59 pm

    [...] con otras soluciones para implementar la política de seguridad requerida ya discutidas aquí. Otros ejemplos podría ser auditoria o validaciones [...]

  5. angerrising dijo

    19 de July del 2010 a las 2:16 am

    hola que tal, sabes no se si me puedes ayudar para darme una idea de como poder mantener un usuario en sesion con struts, saludos

  6. yoyoooyoy dijo

    19 de July del 2010 a las 7:45 am

    Pues lo típico es meterlo en session en un action dedicado al login, si el logeo ha sido correcto; luego la gestión la puedes hacer tú mismo a mano en tus actions (típicamente con un interceptor), puedes utilizar la gestión de roles que viene en Struts por defecto (en el struts.xml le indicas qué roles son permitidos para cada acción) o puedes sobreescribir el método de processRoles del RequestProcessor para gestionarlos de forma más personalizada.

    Saludos

  7. José dijo

    2 de July del 2012 a las 8:03 pm

    La verdad este tema es muy interesante, justo estoy realizando un proyecto y necesito controlar los permisos de usuario, he estado investigando pero no encuentro ejemplos completos, quizá me podrías pasarme un ejemplo para practicarlo. La verdad que lo necesito.Te agradecería mucho.

  8. José dijo

    2 de July del 2012 a las 8:03 pm

    Espero que tengas algún ejemplo…Gracias.

  9. yoyoooyoy dijo

    7 de July del 2012 a las 11:07 am

    Hola José,

    disculpa la tardanza en contestar, a pesar de estar en el paro estoy muy liado :)

    Esta entrada es muy antigua, a día de hoy te recomendaría sin dudar Spring Security, es muy simple, potente y es un proyecto muy bien documentado.

    La seguridad es un tema muy extenso y algo durillo, y la mayor ventaja de este proyecto es que si quieres algo muy simple puedes tenerlo funcionando en un día (es lo que tardaron dos personas novatas por separado en mi anterior proyecto).

    Espero que te sirva!

Comentarios RSS · TrackBack URI

Dejanos tu Comentario

Nombre: (Requerido)

E-Mail: (Requerido)

Sitio WEB:

Comentario:

Comenta