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メインのファイアウォールの一部ではないため、ユーザーはそこでアクセスできません。

これを解決する方法は、呼び出したカスタム ファイアウォールを削除し、ACL 経由でのlogin_firewallアクセスを許可することです。/login

次のコードをsecurity.yml

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

これをなんとか解決しました - リダイレクト ループの問題は、/login ページへのアクセスがないことが原因です。私はファイアウォールを 1 つだけ作成しました。

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 に答える