2013-02-18 158 views
0

我有一個自定義用戶提供程序實體,允許我連接用戶。這個自定義用戶提供者實體根據這個接口實現UserInterface我有一個「getRoles()」函數,它給了我用戶的角色。自定義用戶提供程序實體的遞歸角色

但我的角色是遞歸的。 示例:用戶獲得角色1,角色1繼承角色2,以便用戶獲得角色1和角​​色2。爲了實現這種遞歸性,我創建了一個角色表,一個role_role表(父/子),一個用戶表以及一個user_role表。

要獲得所有用戶的角色,我必須查詢我的數據庫與教條,以便我可以從哪裏做到這一點? 它似乎被禁止從實體查詢,我不能把查詢放在實體庫分類,因爲我不能覆蓋實體的「getRoles()」,它似乎不是一個好主意來訪問存儲庫表單實體。

P.-S .:謝謝你對我的語法沉迷,這是我的第一封英文信息(我是法語)。

回答

0

解決方案是充分利用Doctrine的ORM。

添加在用戶實體的集合變量,它引用的所有的UserRole聯繫到他與ORM:

@ORM\OneToMany(targetEntity="RoleUser", mappedBy="user") 
... 
protected $roleUser; 

在RoleUser實體添加一個ORM這允許用正確的RoleUser用戶綁定:

@ORM\ManyToOne(targetEntity="User", inversedBy="roleUser") 
... 
protected $user; 

現在您可以獲取鏈接到用戶的所有UserRoles。 要獲得角色,請在UserRole實體和Role之間以及RoleRole和Role之間寫入「sames」ORM。最後,您可以從User by $ rolesUtilisateur訪問您的角色。

0

在Symfony 2.x中DB沒有角色層次結構。它在security.yml中配置檢出http://symfony.com/doc/current/book/security.html#hierarchical-roles

如果您不想直接從Symfony 2使用此功能,則必須實施一個RoleVoter,以便從數據庫中直接獲取角色層次結構。

另一種可能性是使用Doctrine Events Listeners(http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html)從DB加載層次結構。你可能需要聽postLoad事件。

+0

謝謝你的有用答案。 致其他想獲得RoleVoter文檔的人:[check out](http://symfony.com/doc/current/components/security/authorization.html#rolevoter) – 2013-02-18 14:58:14

相關問題