Hola, bueno primero presentarme ya que soy nuevo escribiendo aunque ya llevaba un tiempo leyendo librosweb.es gracias a sus tutoriales. Llevo un par de semanas metido en el tema con symfony2 y el tema de seguridad tengo un problemilla con los roles.
Os pongo en situación:
Estoy realizando una aplicación sobre una gestión de eventos en la cual solo dispongo de 3 roles (ROLE_USUARIO
, ROLE_EMPRESARIO
, ROLE_SUPER_ADMIN
). Al ser tan pocos roles lo defino directamente en el security.yml
y en el método getRoles()
realizo la comparación con un campo de la tabla me devuelva un rol u otro. Pero resulta que a la hora de logearme en el debuger de Symfony veo que siempre se me asigna el ROLE_USER
. Llevo tiempo buscando información al respecto y he encontrado nada. He probado directamente a devolver el ROLE_SUPER_ADMIN
en el método getRoles()
y me sigue sucediendo esto. Os pongo el código a continuación a ver si me podéis echar una mano.
# security.yml security: firewalls: secured_area: pattern: ^/ anonymous: ~ form_login: login_path: login check_path: login_check logout: path: /logout target: /
access_control: - { path: ^/registro, roles: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/evento , roles: IS_AUTHENTICATED_ANONYMOUSLY } role_hierarchy: ROLE_USUARIO: ROLE_USER ROLE_EMPRESARIO: [ROLE_EMPRESARIO, ROLE_USER] ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN,ROLE_EMPRESARIO, ROLE_ALLOWED_TO_SWITCH] providers: chain_provider: chain: providers: [in_memory, user_db] in_memory: memory: users: admin: { password: admin, roles: 'ROLE_ADMIN' } user_db: entity: { class: birra\connectBundle\Entity\Usuario, property: email } encoders: Symfony\Component\Security\Core\User\User: algorithm: sha1 iterations: 1 encode_as_base64: false birra\connectBundle\Entity\Usuario: sha512
// usuario.php public function getRoles() { if ($this->tipo == "usuario") { return array('ROLE_USUARIO'); } elseif ($this->tipo == "empresario") { return array('ROLE_EMPRESARIO'); } else{ return array('ROLE_SUPER_ADMIN'); } }
Respuestas
Cuando estés probando cosas relacionadas con la seguridad en local y en el entorno de desarrollo, te aconsejo que lo hagas en el "modo incógnito" del navegador y que lo cierres y vuelvas a abrir cada vez que hagas un cambio importante. Si no, es posible que te encuentres con errores provocados porque tienes abierto el sitio web en otras pestañas del navegador o porque una cookie del pasado relacionada con la seguridad te está afectando.
Por otra parte, la configuración que muestras parece correcta, así que como precaución adicional se me ocurre que en el método getRoles()
compruebes que efectivamente la propiedad $this->tipo
tiene el valor que esperas. Por último, no olvides mirar también el archivo de log (app/logs/dev.log
) que contiene toda la información sobre lo que está sucediendo.
@javiereguiluz