web-dev-qa-db-ja.com

Symfony2.1:パス「/ login_check」のコントローラーが見つかりません

"従来のログインフォームを使用する" チュートリアルを使用して、symfony.comからユーザーを認証しました。単純なhttpauthを使用すると、うまく機能します。

ログインが送信された後、私はこの例外を受け取ります:

パス「/ login_check」のコントローラーが見つかりません。ルーティング構成に一致するルートを追加するのを忘れたのではないでしょうか。

さて、私が読んだチュートリアルでは:

ファイアウォールはこのURLに送信されたフォームを自動的にキャッチして処理するため、/ login_checkURLのコントローラーを実装する必要はありません。

ルートを定義し、ファイアウォール設定を設定しました。

security.yml

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false
    backend:
        pattern:    ^/backend
        anonymous: ~
        form_login:
            provider: entity
            login_path: /login
            check_path: /login_check
            #use_forward: true
        logout:
            path:   /logout
            target: /

routing.yml

login:
    pattern:   /login
    defaults:  { _controller: VitaSecurityBundle:Default:login }
login_check:
    pattern:   /login_check
logout:
    pattern:   /logout
13
falsch

私は自分の問題の解決策を見つけました

パスに/ backendプレフィックスを追加し、「anonymous:〜」行を削除して、バックエンドのACLをコメントアウトしました。

security.yml

    firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false
    login_firewall:
        pattern:    ^/backend/login$
        anonymous:  ~
    backend:
        pattern:    ^/backend
        form_login:
            provider: entity
            login_path: /backend/login
            check_path: /backend/login_check
            #use_forward: true
        logout:
            path:   /backend/logout
            target: /

access_control:
    #- { path: ^/backend, roles: ROLE_USER }

routing.yml

login:
    pattern:   /backend/login
    defaults:  { _controller: VitaSecurityBundle:Default:login }
login_check:
    pattern:   /backend/login_check
logout:
    pattern:   /backend/logout
8
falsch

あなたが抱えている問題はここで説明されています:

http://symfony.com/doc/current/book/security.html 、セクション「よくある落とし穴を避ける」を参照してください。

  1. 必ず/login_checkがファイアウォールの背後にある次に、check_path URL(/ login_checkなど)がフォームログインに使用しているファイアウォールの背後にあることを確認します(この例では、単一のファイアウォールが/ login_checkを含むすべてのURLと一致します)。/login_checkがどのファイアウォールとも一致しない場合、パス「/ login_check」のコントローラーが見つかりませんという例外が発生します。

この例では、パターンで保護されたパスのプレフィックス/ backendを指定しています。動作するには、ログインチェックがこの同じファイアウォールの背後にある必要があります。

したがって、ファイアウォールで指定したパターンに一致させるには、login_checkを次のようなURLパスに配置します。/backend/login_check

18
Żabojad

この問題は、同じパターンのファイアウォールが2つある場合にも発生する傾向があります。例えば:

....
 backend:
            pattern:        ^/*
....
 frontend:
            pattern:        ^/*

次のように、2つのうちの1つを変更する必要があります。

....
 backend:
            pattern:        ^/(administrador|backend)/*
....
frontend:
            pattern:        ^/*
1
GuidoOM

これは私にとってはうまくいきませんでした、そして私は何か他のものを試します:

firewalls:
    dev:
        pattern:    ^/(_profiler|_wdt|css|js)
        security:   false

    login:
        pattern: ^/login$
        security: false

    secured_area:
        pattern: /(admin/.*|login_check)
        provider: in_memory
        form_login:
            check_path: /login_check
            login_path: /login
            default_target_path: /admin
            always_use_default_target_path: true
        logout:
            path:   /logout
            target: /

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

以下の説明で、zabojadからの説明よりも簡単です。重要なことは、login_checkルートをファイアウォールの内側に配置し、ログインを外側に許可することです。またはパターンを使用すると、成功することができます。

マックス

0
wascou

これは、実際のプロジェクトで使用したサンプルコードです。

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

    secured_area:
        pattern:    ^/cmd
        anonymous: ~
        form_login:
            check_path: /cmd/login_check
            login_path: /cmd/login
        remember_me:
            always_remember_me: true
            key:      "%secret%"
            path:     /cmd
            domain:   ~ # Defaults to the current domain from $_SERVER
        logout:
            path:   /cmd/logout
            target: /

    admin:
        pattern: ^/admin
        http_basic:
            realm: "Administration"

    free_area:
        pattern: ^/
        anonymous: ~

私の場合、/ cmd /部分のみが保護され、/ admin /部分も保護されますが、HTTPセキュリティが使用されます。

たぶんあなたは試してみるべきです:security.yml

firewalls:
    dev:
        pattern:  ^/(_(profiler|wdt)|css|images|js)/
        security: false
    backend:
        pattern:    ^/backend
        anonymous: ~
        form_login:
            provider: entity
            login_path: /backend/login
            check_path: /backend/login_check
            #use_forward: true
        logout:
            path:   /backend/logout
            target: /

そしてrouting.ymlの時点で:

login:
    pattern:   /backend/login
    defaults:  { _controller: VitaSecurityBundle:Default:login }
login_check:
    pattern:   /backend/login_check
logout:
    pattern:   /backend/logout

あなたの問題はあなたの/部分でセキュリティがアクティブになっていないという事実から来ているのではないかと思います(あなたの保護された領域のパターンは^ /バックエンドです)

0
Bgi