Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Symfony 2.4 siempre asigna el ROLE_USER

21 de junio de 2014

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

#1

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

23 junio 2014, 9:13