2013-01-07 6 views
6

私は、アクセス制御リストがSymfony2で実装される方法に少し戸惑っています。 Zend Frameworkの(バージョン1 & 2)symfony2のロール/リソースACLを実装する方法

リソースロールのリストのリストが定義され、各役割は、アクセスを許可のリソースのサブセットを割り当てられます。したがって、リソースと役割はACL実装の主な用語ですが、Symfony2ではそうではありません。

レガシーアプリケーションデータベースでは、ロールのリスト、リソースのリスト、および各ロールの許容されるリソースのリスト(多対多の関係)を定義するテーブルがあります。各ユーザーには役割(管理者、スーパー管理者、編集者など)が割り当てられます。

このデータベースをSymfony2アプリケーションで使用する必要があります。 symfonyにおいて私UserエンティティがSymfony\Component\Security\Core\User\UserInterfaceインターフェイスを実装し、それゆえgetRoles)方法を持っているARTICLE_EDIT、ARTICLE_WRITE、COMMENT_EDITなど

: 私のリソースは次のようになります。

私はこのメソッドを使用して許可されたリソースを定義します。つまり、私はリソースとしてロールを使用します(Zend Frameworkのリソースはここではロールと呼ばれます)。

この方法を使用する必要があることを確認しますか?

これは、各ユーザーの役割(管理者、編集者、...)については気にしなくても、そのリソースについてのみです。

私はコントローラに$this->get('security.context')->isGranted('ROLE_ARTICLE_WRITE')を使用します。

これは正しい方法ですか?Symfonyで役割を使うのを回避する方法ではありませんか?

答えて

2

この質問に答えるために何年後に、解決するのは簡単でした。

解決策は、役割とリソースの概念を混在させることです。

roleテーブル、resourceテーブル、およびrole_resource多対多の関係が定義されているとしましょう。

ユーザーはuserテーブルに格納されます。ここで

は、対応するDoctrineのエンティティは以下のとおりです。

ユーザー:

use Symfony\Component\Security\Core\User\UserInterface; 

class User implements UserInterface 
{ 
    /** 
    * @Id @Column(type="integer") 
    * @GeneratedValue 
    */ 
    private $id; 

    /** 
    * @ManyToOne(targetEntity="Role") 
    * @JoinColumn(name="role_id", referencedColumnName="id") 
    **/ 
    private $role; 

    // ... 
} 

が役割:

class Role 
{ 
    /** 
    * @Id @Column(type="integer") 
    * @GeneratedValue 
    */ 
    private $id; 

    /** @Column(type="string") */ 
    private $name; 

    /** 
    * @ManyToMany(targetEntity="Resource") 
    * @JoinTable(name="role_resource", 
    *  joinColumns={@JoinColumn(name="role_id", referencedColumnName="id")}, 
    *  inverseJoinColumns={@JoinColumn(name="resource_id", referencedColumnName="id")} 
    *  ) 
    **/ 
    private $resources; 

    // ... 
} 

リソース:

class Resource 
{ 
    /** 
    * @Id @Column(type="integer") 
    * @GeneratedValue 
    */ 
    private $id; 

    /** @Column(type="string") */ 
    private $name; 

    // ... 
} 

だから今ソリューションは、実装することですUserInterfacegetRolesこの方法:

$this->get('security.context')->isGranted('ROLE_ARTICLE_WRITE') 

use Symfony\Component\Security\Core\User\UserInterface; 
use Symfony\Component\Security\Core\Role\Role; 

class User implements UserInterface 
{ 
    // ... 

    /** 
    * @var Role[] 
    **/ 
    private $roles; 

    /** 
    * {@inheritDoc} 
    */ 
    public function getRoles() 
    { 
     if (isset($this->roles)) { 
      return $this->roles; 
     } 

     $this->roles = array(); 

     $userRole = $this->getRole(); 

     $resources = $userRole->getResources(); 

     foreach ($resources as $resource) { 
      $this->roles[] = new Role('ROLE_' . $resource); 
     } 

     return $this->roles; 
    } 

} 

この方法では、現在のユーザに起因するリソースはこの方法を確認することができます(名前がある​​リソースがある考慮して)

関連する問題