En Symfony2, la acción de inicio de sesión me muestra como desconectado cuando en realidad estoy conectado

Si un usuario que ha iniciado sesión va a la acción de inicio de sesión, quiero redirigirlo a otra página. Pero no puedo averiguar cómo detectar si el usuario ha iniciado sesión o no mientras está dentro del loginAction método. El contexto de seguridad en la acción de inicio de sesión hace que parezca que estoy desconectado cuando no lo estoy.

Como prueba, estoy solicitando las dos páginas siguientes mientras estoy conectado al sitio. ¿Por qué no puedo obtener acceso al usuario en la acción de inicio de sesión?

Aquí está mi acción de inicio de sesión:

public function loginAction()
{
    $token = $this->get('security.context')->getToken();
    print_r(get_class($token));
        // Outputs "Symfony\Component\Security\Core\Authentication\Token\AnonymousToken"
    print_r($token->getUser());
        // Outputs "anon."
}

Aquí hay una acción genérica en la aplicación, protegida por el inicio de sesión:

public function regularAction()
{
    $token = $this->get('security.context')->getToken();
    print_r(get_class($token));
        // Outputs "Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken"
    print_r(get_class($token->getUser()));
        // Outputs "Company\BaseBundle\Entity\User"
}

Aquí está mi security.yml:

security:
    encoders:
        Company\BaseBundle\Entity\User:
            algorithm:   sha1
            iterations: 1
            encode_as_base64: false
    providers:
        main:
            entity: { class: Company\BaseBundle\Entity\User, property: user_name }
    firewalls:
        login_firewall:
            pattern:    ^/login$
            anonymous:  ~
        main:
            pattern: ^/
            form_login:
                login_path: /login
                check_path: /login_check
                post_only: true
                always_use_default_target_path: false
                default_target_path: /
                use_referer: true
                failure_path: null
                failure_forward: false
                username_parameter: user_name
                password_parameter: password_hash
                csrf_parameter: _csrf_token
                intention: authenticate
            logout:
                path: /logout
                target: /
    acl:
        connection: default

EDITAR: no pensé que el resto de mis firewalls fueran pertinentes, pero después de leer la respuesta de ilanco, creo que podrían ser

security:
    encoders:
        Company\BaseBundle\Entity\User:
            algorithm:   sha1
            iterations: 1
            encode_as_base64: false

    providers:
        main:
            entity: { class: Company\BaseBundle\Entity\User, property: user_name }

    firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false

        login_firewall:
            pattern:    ^/login$
            anonymous:  ~
        password_reset:
            pattern:    ^/passwordreset/*$
            anonymous:  ~
        error_firewall:
            pattern:    ^/error/.*$
            anonymous:  ~
        unsupported_broswers:
            pattern:    ^/unsupported$
            anonymous:  ~
        security_question_firewall:
            pattern:  ^/user/(locked|security_question)/(new)*$
            anonymous:  ~
        api_firewall:
            pattern:  ^/api/.*$
            provider: main
            http_basic:
                realm: "Secured API Area. Login with your regular credentials"
                provider: main
        main:
            pattern: ^/
            form_login:
                login_path: /login
                check_path: /login_check
                post_only: true
                always_use_default_target_path: false
                default_target_path: /
                use_referer: true
                failure_path: null
                failure_forward: false
                username_parameter: user_name
                password_parameter: password_hash
                csrf_parameter: _csrf_token
                intention: authenticate
            logout:
                path: /logout
                target: /
    acl:
        connection: default

Siguiendo la sugerencia de ilanco, eliminé esto:

    login_firewall:
        pattern:    ^/login$
        anonymous:  ~

y agregó esto directamente debajo del providers sección:

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }

Pero luego tuve un error de bucle de redirección cuando accedí a /login.

preguntado el 22 de mayo de 12 a las 19:05

2 Respuestas

He luchado con este problema también.

/login no forma parte del cortafuegos principal, por lo que no se puede acceder al usuario allí.

La forma de resolver esto es eliminar el firewall personalizado al que ha llamado login_firewall y permitir el acceso a /login a través de LCA.

Agregue el siguiente código a su security.yml

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }

contestado el 22 de mayo de 12 a las 19:05

En respuesta a su respuesta, edité la publicación original. ¿Podrías mirarlo por favor? - mattalxndr

poner access_control: bajo el Tema G: Cómo recibir pagos por adelantado del crédito tributario por hijos security:no, providers: - ilanco

Se las arregló para resolver este problema: el problema con el bucle de redirección se debe a la falta de acceso a la página de inicio de sesión. Creé solo un firewall, configuré el acceso para anónimo: ~, definí access_control para no usuarios y ¡listo!

security:
    firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: true
            anonymous: ~ 
        secured_area:
            pattern:    ^/
            anonymous:  ~
            form_login:
                login_path:  /login
                check_path:  /login_check
                always_use_default_target_path: true
                default_target_path: /
            logout:
                path:   /logout
                target: /
    providers:
        main:
            entity: { class: Core\UserBundle\Entity\User, property: username }
    encoders:
        Core\UserBundle\Entity\User: 
            algorithm:   sha256
            iterations: 10
            encode_as_base64: true
    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/admin, roles: ROLE_SUPERADMIN }
        - { path: ^/user, roles: ROLE_USER }
        - { path: ^/, roles: IS_AUTHENTICATED_FULLY }

Respondido el 13 de junio de 12 a las 09:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.