14

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
4

5 に答える 5

18

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

http://symfony.com/doc/current/book/security.htmlのセクション「AvoidCommonPitfalls」を参照してください。

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

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

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

于 2013-01-08T07:52:34.203 に答える
8

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

パスに/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
于 2013-01-04T12:05:47.533 に答える
1

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

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

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

....
 backend:
            pattern:        ^/(administrador|backend)/*
....
frontend:
            pattern:        ^/*
于 2014-02-23T18:51:41.767 に答える
0

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

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ルートをファイアウォールの内側に配置し、ログインを外側に許可することです。またはパターンを使用すると、成功することができます。

マックス

于 2013-03-12T22:01:38.157 に答える
0

これが私が実際のプロジェクトで使用したサンプルコードです:

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

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

于 2012-09-13T15:49:39.893 に答える