Symfony2: Control Acceso a URLs

martes, 4 de diciembre de 2012 Etiquetas: ,


Introducción

Sumfony2 nos proporciona una sistema de seguridad basado en firewalls, que nos permite definer las urls a las cuales se quiere restringuir el acceso. Así podemos indicar una serie de direcciones indicando que, para acceder a ellas, el usuario debe estar autentificado. Symfony2 si el usuario no esta loggeado, automaticamente, lo redirecciona a la pantalla de login.

En esta entrada vamos a ver algunos ejemplos de configuración, y veremos como en ocasiones la tarea no resulta tan sencilla como puede parecer, ya que el número de combinaciones de url puede ser infinito, entonces, entran en acción expresiones regulares.

Solución

La configuración de seguridad se realiza en el fichero app/config/security.yml y en la sección access_control la configuración que vamos a ver en este ejemplo. Un ejemplo básico de configuración sería el siguiente:

# app/config/security.yml
 
security:
    # ...
    access_control:
        - { path: ^/post/new, roles: ROLE_USER }
    # ...
En este ejemplo indicamos que solo puede dar de alta un nuevo post si el usuario esta registrado. Si se intenta acceder directamente a la url sin estar registrado, Symfony2 redirigirá al usuario a al pantalla de login. De esta forma, se puede definir una web como acceso público, y las partes que necesiten registros asegurarlas en este apartado.

Pero puede que te haya surguido una pregunta, ¿qué pasa mi dirección tiene una parte variable? Por ejemplo se podría dar el caso que para editar un post tengas un dirección del tipo: /post/12/edit No voy a definir las infinitas combinaciones que necesitaré según nuestro site crezca. Como ya he comentado en la introducción lo solucionamos completando la expresión regular de la dirección.

# app/config/security.yml

security:
    # ...
    access_control:
        - { path: ^/post/new, roles: ROLE_USER }
        - { path: ^/post/\d*/edit, roles: ROLE_USER }
    # ...

De esta forma tan sencilla con expresiones regulares tenemos cubierta todas la combinaciones de identificadores posibles. También necesitaremos expresiones regulares si tenemos activada la internacionalización de nuestra web. Veamos como hacerlo, podemos indicar los posibles valores de nuestros idiomas:

# app/config/security.yml

security:
    # ...
    access_control:
        - { path: ^/(es|fr)/post/new, roles: ROLE_USER }
        - { path: ^/(es|fr)/post/\d*/edit, roles: ROLE_USER }
    # ...
O bien si hay mucho idiomas, o se están añadiendo nuevos continuamente nos puede interesar algo del estilo:

# app/config/security.yml

security:
    # ...
    access_control:
        - { path: ^/[a-z]*/post/new, roles: ROLE_USER }
        - { path: ^/[a-z]*/post/\d*/edit, roles: ROLE_USER }
    # ...

Bibliografia

[] Symfony2 Book. Chapter 17. Security. Securing Specific URL Patterns (inglés)
[] wikipedia expresiones regulares

0 comentarios:

Publicar un comentario