web-dev-qa-db-ja.com

セキュリティファイアウォール構成でform_loginを使用して、ファイアウォールによって処理されるようにチェックパスを構成する必要があります。

「通常の」ユーザー向けのプロバイダーである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
11
Antonio Peric

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 .....
8
zizoujab

あなたのコードは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を使用しません。

3
shakaran

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
1
Henry

場合によっては、これはsymfonyがcomposerによってインストールされたときに生成されるデフォルトのセキュリティ設定が原因であることがわかります。

私の場合、security.ymlには、次のセクションがあります。

default:
    anonymous: ~

これはキャッチオールとして機能していたため、ルートを処理するFOSUserBundleの機能を妨害していました。削除するか、自分で指定したルートがある場合は、同じURLパスも処理していないことを確認してください。

1
LovelyHelper