Security 在symfony2中,登录操作在I';我真的登录了

Security 在symfony2中,登录操作在I';我真的登录了,security,symfony,login,Security,Symfony,Login,如果登录用户转到登录操作,我想将他们重定向到另一个页面。但是我不知道如何在loginAction方法中检测用户是否登录。登录操作中的安全上下文使我在未注销时看起来好像已注销 作为测试,我在登录站点时请求以下两个页面。为什么我不能在登录操作中访问用户 以下是我的登录操作: public function loginAction() { $token = $this->get('security.context')->getToken(); print_r(get_cla

如果登录用户转到登录操作,我想将他们重定向到另一个页面。但是我不知道如何在
loginAction
方法中检测用户是否登录。登录操作中的安全上下文使我在未注销时看起来好像已注销

作为测试,我在登录站点时请求以下两个页面。为什么我不能在登录操作中访问用户

以下是我的登录操作:

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."
}
以下是应用程序中的一般操作,受登录名保护:

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"
}
这是我的
安全性。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
编辑:我不认为我的其他防火墙与此相关,但在阅读了ilanco的答案后,我认为它们可能与此相关

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
根据ilanco的建议,我删除了以下内容:

    login_firewall:
        pattern:    ^/login$
        anonymous:  ~
并将其直接添加到
提供者
部分:

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

但是,当我访问/登录时,出现了重定向循环错误。

我也遇到了这个问题

/login
不是主防火墙的一部分,因此用户无法访问主防火墙

解决此问题的方法是删除您调用的自定义防火墙
login\u firewall
,并允许通过ACL访问
/login

将以下代码添加到您的
security.yml

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

我也在努力解决这个问题

/login
不是主防火墙的一部分,因此用户无法访问主防火墙

解决此问题的方法是删除您调用的自定义防火墙
login\u firewall
,并允许通过ACL访问
/login

将以下代码添加到您的
security.yml

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

设法解决了这个问题-重定向循环的问题是由于缺少对/login页面的访问而导致的。我只做了一个防火墙,设置了匿名访问:~,为非用户定义了访问控制,瞧

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 }

设法解决了这个问题-重定向循环的问题是由于缺少对/login页面的访问而导致的。我只做了一个防火墙,设置了匿名访问:~,为非用户定义了访问控制,瞧

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 }

为了回应你的回答,我编辑了原始帖子。你能看一下吗?把
访问控制:
放在
安全:
下,而不是
提供者:
作为对你回答的回应,我编辑了原始帖子。你能看一下吗?把
访问控制:
放在
安全:
下,而不是
提供者: