2012-10-22 22 views
8

私はSymfony2を使用しています。ユーザとロールはすでに自分のDBに保存されています。Symfony2の "access_control"情報をデータベースに保存する方法は?

access_control: 
    - { path: ^/admin, role: ROLE_ADMIN} 
    - { path: ^/users, role: ROLE_MANAGER} 

しかし、私は、データベース内のこのACCESS_CONTROL情報を保存したいと思いますので、私のシステムからのユーザーは、管理インタフェースを使用してアクセス許可自体を変更することができます:私はsecurity.ymlに以下のようなものを設定した場合、それは素晴らしい作品。

ACLとFOSUserBundleを見ましたが、解決策が見つかりませんでした。私はif ($user->hasRole($role))のようなものでパーミッションをチェックできることがわかりましたが、私はすべてのコントローラでこれを行う必要があります。

ダイナミックな「access_control」機能を定義する方法はありますか? access_controlをtrueまたはfalseを返す可能性のあるクラスにリダイレクトするようなものかもしれません。 どのような解決策ですか?

答えて

5

データベースの格納された役割に対して検証するアクション/サービスに設定する特定の役割(例:DB_ROLE_CHECK)を設定するのが最善の方法です。

次に、DB_ROLE_CHECKにフックし、データベースエントリに対して要求を検証するセキュリティボータを作成します。

参照:

+0

ありがとう、それは完璧に働いた! –

+0

私はそれを得ていませんでした。役割階層にDB_ROLE_CHECKロールを配置する必要があるところ、投票者のルートをチェックする方法は?たとえば、[ルート、役割]のようなDBエントリがあります。そして、access_controlルール^ /:DB_ROLE_CHECK、そうですか?したがって、すべてのリクエストに対してDBVoterが実行されます。 $属性では、私は役割、そして$トークンを持ちます。そして、私は$ subject paramとしてルートかパスを持っていますか?ですから、DBレコードをパスで取得し、decisionManagerの$ tokenから$ userを使ってロールを使用する必要があります。 –

3

アクセスマップはhereが構築されています。

access_controlが見つからない場合、何も行われません。

AccessMapInterfaceの独自の実装を定義して、クラスにパラメータsecurity.access_map.classを上書きします。

おそらく、あなたのAccessMapを構築するための工場が必要です。

+1

私はそれをやろうとしていますが、どうすればsecurity.access_map.classパラメータを上書きできますか?私はこれをsecurity.ymlに入れてみました:security:access_map:class:CRM \ CoreBundle \ Security \ DBAccessMap –

関連する問題