3

システムで特定の役割を持つグループ内のユーザーの高度な承認と管理を特徴とする CRM に取り組んでいます。

基本的に、私がやりたいことはこれです:

  • (ドメイン) モデル / コントローラー / アクションの動的承認を管理する
  • オブジェクトとフィールドの動的承認を管理します。

security.yml ファイルの ROLE_xxxx については知っていますが、ロールをハードコーディングしたくありません。

たとえば、スーパー管理者がカスタム承認ロールを作成できる、一種のマトリックス/グリッドが必要です。

これらの役割の 1 つとして、「チーム リーダー」は従業員の電子メール アドレスを表示および編集できますが、Employee_Wage フィールドを表示または編集することはできません。

もう 1 つのユース ケースは、ユーザー グループ「Accounting」のユーザーがアクション generateInvoiceAction() を呼び出すことはできますが、アクション createNewEmployeeAction() にアクセスできない場合です。

もう 1 つの使用例は、PROJECT LEADER が newProjectAction() を使用してプロジェクトを追加できるが、PROJECT オブジェクトの特定のフィールド/属性がグループ PROJECT LEADER によって表示/アクセスできない場合です。

セキュリティとルーティングでこれらを設定できることは理解していますが、これらのロールをハードコーディングしたくありません。たとえば、会社が特定の役割を持つ新しいグループを作成することを決定した場合、作成できるはずです。

私の(疑似)ソリューション

  1. すべてのドメイン モデル、アクション/関数、およびオブジェクト/フィールドを調べて、CRUD のロールを作成します。たとえば、EMPLOYEE_FIRSTNAME_READ、EMPLOYEE_FIRSTNAME_UPDATE、EMPLOYEE_CREATE、EMPLOYEE_EDIT、EMPLOYEE_DELETE などを作成します。

  2. すべてのロールの組み合わせの配列を持つタイトル フィールドを持つデータベース オブジェクト「グループ」を作成します。

  3. ユーザーをグループに入れる

これは行くべき道ですか、それともSymfony2でこれを達成するためのより良い方法はありますか?

基本的には、管理者のバックエンドを使用して構成できるドメイン モデル、オブジェクト、フィールドなどに基づいて特定の役割を持つグループを作成します。

これが正しく説明されていることを願っています。お気軽に返信して詳細をお尋ねください。

(以前のバージョンの Invision Power Board では、パーミッション マスク グリッドを構成してグループにアタッチすることができました)

4

2 に答える 2

2

私はちょうど同じ問題に直面しており、既存のバンドル (FOSUserBundle、SonataUserBundle) を何度も検索して参照した後、次のように解決します。

独自のユーザー エンティティを作成して UserInterface を拡張し、関数 getRoles(); をカスタマイズします。 http://symfony.com/doc/current/cookbook/security/custom_provider.html 1. この関数内で、ユーザーがどのグループに属しているか、グループからすべてのロールを取得したかを照会できます。詳細については、FOSUserBundle のユーザー モデルとユーザー エンティティ ファイルを参照してください。https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Model/User.php 行 247

  1. 次に、バックエンドでグループとエンティティを通常のエンティティとして管理し、ユーザーをグループに追加できます

  2. ACL を使用しますが、ユーザー ID をロール ID に変更します。 http://symfony.com/doc/current/cookbook/security/acl_advanced.html

于 2013-08-28T09:09:28.603 に答える
2

あなたがここで言ったことから、行く方法は を使うことだと思いますACL

http://symfony.com/doc/master/cookbook/security/acl.html

ただし、次のような方法ですべての安全なメソッドを開始するために、自分でアクセス許可を確認する必要があります。

$securityContext = $this->get('security.context');
$comment = ... // load using Doctrine?

if (false === $securityContext->isGranted('EDIT', $comment))
{
    throw new AccessDeniedException();
}

Symfony のクラスを拡張する場合はController、可能な限り間違いを最小限に抑えるために、間に共通のセキュリティ ロジックを実装するクラスをもう 1 つ追加することを強くお勧めします...

一方、サービスを操作する場合、オブジェクトをパラメーターとして指定できる場合、関連するドメインオブジェクトのアクセス許可を確認するために、@SecureParam注釈に依存することができます (私はそれを使用すると仮定します)。JMSSecurityExtraBundle

http://jmsyst.com/bundles/JMSSecurityExtraBundle/master/annotations

これが少し役立つことを願っています...

于 2012-12-12T22:42:16.423 に答える