2

私はSymfonyクックブックに従っており、「一般的な落とし穴を回避する」には次のように書かれています:

また、ファイアウォールで匿名ユーザー (キーなし) が許可されていない場合anonymousは、ログイン ページで匿名ユーザーを許可する特別なファイアウォールを作成する必要があります。

firewalls:
    # order matters! This must be before the ^/ firewall
    login_firewall:
        pattern:   ^/login$
        anonymous: ~
    secured_area:
        pattern:    ^/
        form_login: ~

したがってsecurity.yml、次のようにファイルを実装しました。

security:
    providers:
        in_memory:
            memory:
                users:
                    ryan:
                        password: pass1
                        roles: ROLE_USER
                    admin:
                        password: pass2
                        roles: ROLE_ADMIN

    encoders:
        Symfony\Component\Security\Core\User\User: plaintext

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

        login_firewall:
            anonymous: ~
            pattern: ^/login$
            context: foo

        main:
            pattern: ^/

            form_login:
                login_path: /login
                check_path: /login
                default_target_path: /secret

            logout:
                path: /logout
                target: homepage

            context: foo

    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/secret, roles: ROLE_ADMIN }

問題は、ログインしようとするとログイン ページにリダイレクトされ、認証されないことです。また、2 つのファイアウォール間でコンテキストを共有しようとしました (つまり、同じ を使用していますcontext) が、プラスの効果はありませんでした。

この構成の何が問題になっていますか?

編集:

これは私のlogin.html.twigテンプレートです:

<html>
    <body>
        {% if error %}
            <div>{{ error.messageKey | trans(error.messageData, 'security') }}</div>
        {% endif %}

        <form action="{{ path('login') }}" method="post">
            <label for="username">Username:</label>
            <input type="text" id="username" name="_username" value="{{ last_username }}" />

            <label for="password">Password:</label>
            <input type="password" id="password" name="_password" />

            <button type="submit" >Login</button>
        </form>
    </body>
</html>
4

1 に答える 1

0

理由はわかりませんが(誰かがそうする場合は、別の回答を追加してください)、form_login要素をinsideと insideの両方に配置すると、ユーザーが認証されます。login_firewallmain

つまり、作業security.xml構成は次のとおりです。

編集:それmain -> form_loginも可能ですnull

security:
    providers:
        in_memory:
            memory:
                users:
                    ryan:
                        password: pass1
                        roles: ROLE_USER
                    admin:
                        password: pass2
                        roles: ROLE_ADMIN

    encoders:
        Symfony\Component\Security\Core\User\User: plaintext

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

        login_firewall:
            anonymous: ~
            pattern: ^/(login|logout)?$
            context: foo

            form_login:
                login_path: /login
                check_path: /login

            logout:
                path: /logout
                target: homepage

        main:
            pattern: ^/
            form_login: ~
            context: foo

    access_control:
        - { path: /(login|logout)?$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: /secret, roles: ROLE_ADMIN }
于 2016-02-22T15:47:53.257 に答える