2012-08-28 11 views
5

いくつかのACL権限が必要なSymfony2アプリケーションが忙しいです。symfony2複数のユーザの複数のオブジェクトへのACLアクセス

私はSymfony2を初心者としているので、正しい方法を見ているかどうかはわかりません。

私は複数のクライアントを持ち、それぞれ複数のアカウントを持っています。

すべてのクライアントとすべてのアカウントにアクセスできるスーパー管理者(ROLE_SUPER_ADMIN)があります。 次に、管理者ロール(ROLE_ADMIN)があります。これは、特定のクライアントおよびそのクライアントのすべてのアカウントへのアクセスのみを許可します。 次にエージェント(ROLE_AGENT)があります。これには、クライアントの特定のアカウントに対するアクセス許可のみが必要です。

私は、私は次のコードを使用することができ、特定のオブジェクトへのユーザーアクセスを与えるためにsymfonyのドキュメントで見た:新しいアカウントを作成するときに、私が与えることができるので、

// creating the ACL 
$aclProvider = $this->get('security.acl.provider'); 
$objectIdentity = ObjectIdentity::fromDomainObject($account); 
$acl = $aclProvider->createAcl($objectIdentity); 

// retrieving the security identity of the currently logged-in user 
$securityContext = $this->get('security.context'); 
$user = $securityContext->getToken()->getUser(); 
$securityIdentity = UserSecurityIdentity::fromAccount($user); 

// grant owner access  
$acl->insertObjectAce($securityIdentity, MaskBuilder::MASK_OWNER); 
$aclProvider->updateAcl($acl); 

を、現在ログイン中新しく作成されたアカウントへのユーザーアクセス。 しかし、アカウントへのクライアントアクセスの他のすべてのユーザーへのアクセスを許可するにはどうすればよいですか?

すべてのユーザーをループしてすべてのユーザーに対して上記のコードを実行する必要はありません。

たとえば、すべてのクライアントを表示しているときに、どのクライアントにアクセスしているのかを知る必要があります。また、アカウントを表示するときに、ユーザーがアクセスできるアカウントを知る必要があります。

また、新しいユーザーをクライアントに追加する場合、ユーザーはそのクライアントのすべてのアカウントに自動的にアクセスする必要があります。

私は、ユーザーがアカウント/クライアントにアクセスできるかどうかを知る必要があります。ユーザーがアクセス権を持っている場合、自動的に表示/編集/削除が許可されます。

+2

特定の役割のすべてのユーザーに権限を割り当てる必要がある場合は、代わりに役割ベースの「ACL」を使用する必要があります。いくつかのサンプルコードを書くことができるはずです(次の数時間で)。しかし、ロールがあなたの後ろのものでないならば、あなたは**あなたが許可を割り当てたいと思う各ユーザを反復する必要があります。 –

答えて

0

このケースでは、エンティティ間のManyToMany関係を検証するカスタムセキュリティサービスを使用しました。それは理想的な決定ではなく、心に留めておいてください。

まず、すべてのコントローラーアクションでトリガーされるリスナーを作成する必要があります。

サービスでは、リクエスト、コントローラインスタンス、およびアクションと呼ばれるアクセス権があります。だから私たちはユーザーのアクセス権を持っているかどうかを判断することができます。

class AppSecurity 
{ 
    protected $em; 
    protected $security; 
    /** @var $user User */ 
    protected $user; 

    public function __construct(EntityManager $em, SecurityContext $security) 
    { 
     $this->em = $em; 
     $this->security = $security; 

     if($security->getToken() !== null && !$security->getToken() instanceof AnonymousToken) { 
      $this->user = $security->getToken()->getUser(); 
     } 
    } 

    /** 
    * @param $controller 
    * @param string $action 
    */ 
    public function hasAccessToContoller($controller, $action, Request $request) 
    { 
     $attrs = $request->attributes->all(); 
     $client = $attrs['client']; 

     /* db query to check link between logged user and request client */ 
    } 
} 

あなたはParamConverterのような非常に厄介な注釈を使用している場合は、簡単に要求からentitesを使用する準備ができて抽出することができます。

関連する問題