"従来のログインフォームを使用する" チュートリアルを使用して、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
パスに/ 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
あなたが抱えている問題はここで説明されています:
http://symfony.com/doc/current/book/security.html 、セクション「よくある落とし穴を避ける」を参照してください。
- 必ず
/login_check
がファイアウォールの背後にある次に、check_path URL(/ login_checkなど)がフォームログインに使用しているファイアウォールの背後にあることを確認します(この例では、単一のファイアウォールが/ login_checkを含むすべてのURLと一致します)。/login_checkがどのファイアウォールとも一致しない場合、パス「/ login_check」のコントローラーが見つかりませんという例外が発生します。
この例では、パターンで保護されたパスのプレフィックス/ backendを指定しています。動作するには、ログインチェックがこの同じファイアウォールの背後にある必要があります。
したがって、ファイアウォールで指定したパターンに一致させるには、login_checkを次のようなURLパスに配置します。/backend/login_check
この問題は、同じパターンのファイアウォールが2つある場合にも発生する傾向があります。例えば:
....
backend:
pattern: ^/*
....
frontend:
pattern: ^/*
次のように、2つのうちの1つを変更する必要があります。
....
backend:
pattern: ^/(administrador|backend)/*
....
frontend:
pattern: ^/*
これは私にとってはうまくいきませんでした、そして私は何か他のものを試します:
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ルートをファイアウォールの内側に配置し、ログインを外側に許可することです。またはパターンを使用すると、成功することができます。
マックス
これは、実際のプロジェクトで使用したサンプルコードです。
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
あなたの問題はあなたの/部分でセキュリティがアクティブになっていないという事実から来ているのではないかと思います(あなたの保護された領域のパターンは^ /バックエンドです)