1

如果登录用户进入登录操作,我想将他们重定向到另一个页面。但我不知道如何在方法内部检测用户是否登录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"
}

这是我的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

编辑:我不认为我的其余防火墙是相关的,但在阅读了 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:  ~

并将其直接添加到该providers部分下:

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

但是当我访问 /login 时出现重定向循环错误。

4

2 回答 2

1

我也一直在努力解决这个问题。

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

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

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

access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
于 2012-05-22T18:26:21.677 回答
0

设法解决了这个问题 - 重定向循环的问题是由于无法访问 /login 页面引起的。我只做了一个防火墙,设置匿名访问:〜,为非用户定义了access_control,瞧!

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 }
于 2012-06-13T07:47:13.687 回答