「通常の」ユーザー向けのプロバイダーであるWebサービスがあります。管理者にFosUserBundleを使用したい。上記は私のセキュリティ構成です。通常のユーザーのログインは問題なく機能しますが、管理者としてログインしたいときに次のメッセージが表示されます。
「セキュリティファイアウォール構成でform_loginを使用して、ファイアウォールによって処理されるようにチェックパスを構成する必要があります。」
これが私のセキュリティ構成です:
security:
encoders:
Locastic\CustomUserBundle\Security\User\User: plaintext
FOS\UserBundle\Model\UserInterface: sha512
providers:
fos_userbundle:
id: fos_user.user_provider.username_email
webservice:
id: locastic.user_provider
firewalls:
main:
pattern: ^/admin
form_login:
provider: fos_userbundle
login_path: fos_user_security_login
check_path: fos_user_security_check
csrf_provider: form.csrf_provider
logout: true
anonymous: true
remember_me:
key: "%secret%"
lifetime: 31536000 # 365 days in seconds
path: /
domain: ~ # Defaults to the current domain from $_SERVER
user-service:
pattern: ^/
logout:
path: /logout
anonymous: true
webservice-login:
check_path: /prijava-provjera
login_path: /prijavi-se
provider: webservice
always_use_default_target_path: true
default_target_path: /stanje-racuna
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, role: ROLE_ADMIN }
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
form_login
をファイアウォールの下に置く必要があると思います(main
または別のファイアウォールを追加します)
メインファイアウォールの下のform_login:
firewalls:
main:
pattern: ^/admin
form_login:
provider: fos_userbundle
login_path: fos_user_security_login
check_path: fos_user_security_check
csrf_provider: form.csrf_provider
logout: true
anonymous: true ....
別のファイアウォールの下のform_login
firewalls:
main:
pattern: ^/admin
second_firewall:
pattern: ^/
form_login:
provider: fos_userbundle
login_path: fos_user_security_login
check_path: fos_user_security_check
csrf_provider: form.csrf_provider
logout: true
anonymous: true .....
あなたのコードはcheck_path値の一部でのみ間違っています。
これは元のコードです:
firewalls:
main:
pattern: ^/admin
form_login:
provider: fos_userbundle
login_path: fos_user_security_login
check_path: fos_user_security_check
csrf_provider: form.csrf_provider
logout: true
anonymous: true
そして、次のようなものを使用する必要があります。
firewalls:
main:
pattern: ^/admin
form_login:
provider: fos_userbundle
login_path: fos_user_security_login
check_path: /login_check
csrf_provider: form.csrf_provider
logout: true
anonymous: true
注check_pathの値は文字列のみです。値fos_user_security_checkを使用する場合は、 SecurityController.php クラスを呼び出し、 checkAction() メソッドを呼び出します。 「セキュリティファイアウォール構成でform_loginを使用して、ファイアウォールによって処理されるチェックパスを構成する必要があります。」というエラーが表示されたRuntimeError例外がスローされます。したがって、修正は非常に単純なので、値fos_user_security_checkを使用しません。
pattern: ^/admin
これはおそらくあなたの問題が始まるところです。
これを^ /に戻してみてください
次に、FosUserBundleのルートを変更します
# app/config/routing.yml
fos_user_security:
resource: "@FOSUserBundle/Resources/config/routing/security.xml"
prefix: /admin
fos_user_profile:
resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
prefix: /admin/profile
fos_user_register:
resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
prefix: /admin/register
fos_user_resetting:
resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
prefix: /admin/resetting
fos_user_change_password:
resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
prefix: /admin/profile
場合によっては、これはsymfonyがcomposerによってインストールされたときに生成されるデフォルトのセキュリティ設定が原因であることがわかります。
私の場合、security.ymlには、次のセクションがあります。
default:
anonymous: ~
これはキャッチオールとして機能していたため、ルートを処理するFOSUserBundleの機能を妨害していました。削除するか、自分で指定したルートがある場合は、同じURLパスも処理していないことを確認してください。