Ver índice de contenidos del libro

13.6. Roles

Los roles son la clave del proceso de autorización. Cada usuario tiene asignado una serie de roles y cada recurso requiere uno o más roles para acceder a él. Si el usuario tiene los roles necesarios, se le concede acceso. En caso contrario se le deniega el acceso.

Los roles son bastante simples, y básicamente son cadenas de texto que puedes inventarte y utilizar como quieras (aunque internamente los roles se tratan como objetos). Si necesitas por ejemplo limitar el acceso a la sección admin del blog de tu sitio web, puedes proteger esa sección con un rol llamado ROLE_BLOG_ADMIN. No tienes que definir o registrar este nuevo rol en ningún sitio. Tan pronto como te inventes un nombre de rol ya puedes utilizarlo.

Nota Para que los roles sean procesados automáticamente por Symfony, sus nombres deben comenzar con el prefijo ROLE_. Si tu aplicación es tan avanzada que prefieres definir tus propios roles directamente con la clase Role de Symfony, entonces no utilices el prefijo ROLE_ en sus nombres.

13.6.1. Jerarquía de roles

Para que no tengas que asignar muchos roles a los usuarios, puedes definir reglas sencillas para crear toda una jerarquía de roles:

# app/config/security.yml
security:
    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
<!-- app/config/security.xml -->
<config>
    <role id="ROLE_ADMIN">ROLE_USER</role>
    <role id="ROLE_SUPER_ADMIN">ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH</role>
</config>
// app/config/security.php
$container->loadFromExtension('security', array(
    'role_hierarchy' => array(
        'ROLE_ADMIN'       => 'ROLE_USER',
        'ROLE_SUPER_ADMIN' => array(
            'ROLE_ADMIN',
            'ROLE_ALLOWED_TO_SWITCH'
        ),
    ),
));

La configuración anterior hace que los usuarios con rol ROLE_ADMIN también tengan el rol ROLE_USER. De la misma forma, asignar el rol ROLE_SUPER_ADMIN implica que se han asignado también los roles ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH y ROLE_USER.