0

私は Symfony2 で小さなバックオフィスを開発しています。URL パターン (および)ROLE_ADMINを持つページにのみアクセスできるようにユーザーに付与したいと思います。^/admin/^/logout$

これまでのところ、アクセス制御を使用して他のユーザーがこれらのページにアクセスするのを制限することができました:

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

    secured_area:
        pattern:    ^/
        anonymous:  ~
        form_login:
            provider:       fos_userbundle
            csrf_provider:  form.csrf_provider
            login_path:     /login
        logout:
            invalidate_session: false

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 }
    - { path: ^/, role: ROLE_USER }

しかし、管理者ユーザーをこれらのページに制限する方法が見つかりません。これを達成するための最良の方法は何ですか?

4

3 に答える 3

2

あなたの問題は、おそらく FOSUserBundle に隠された小さな宝石です。管理者としてログインしてからプロファイラーを確認すると、ユーザーが ROLE_ADMIN と ROLE_USER の両方を持っていることがわかります。これが、保護されたページにアクセスできる理由です。FOSUserBundle の Model を見ると、User クラスで、ユーザーに対して getRoles() を呼び出すと、常にデフォルトのロールが配列に追加されていることがわかります。この定数は、UserInterface クラスで ROLE_USER として設定されます。

検討できる解決策はたくさんありますが、おそらく最も簡単なのは、フロントエンド ユーザーに別の役割を使用することです。たとえば、ロール ROLE_CUSTOMER を使用する場合、ロール階層で明示的に定義しない限り、管理者ユーザーはこのロールを取得できません。そうすれば、両方のユーザー セットがそれぞれのセクションに制限されます。

于 2013-10-04T09:46:30.740 に答える
2

あなたの問題は、プログラミングの問題ではなく、概念の問題だと思います。定義上、管理者はすべてのページにアクセスできます。それが管理者の役割です。あなたの問題に対抗するにrole_hierarchyは、security.ymlファイルを次のように変更します。

role_hierarchy:
    ROLE_ADMIN: ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN

つまり、ROLE_USER 要求が何であれ、ROLE_ADMIN はアクセスできるということです。その階層を削除すると、管理者がユーザー ページにアクセスできなくなる可能性があります

私がお勧めするオプションは、単に新しいロールを作成することです.URLにROLE_MANAGERのみアクセスできるようなもの^/admin/です.これはあなたのケースにより適しています.

于 2013-09-20T16:15:06.643 に答える