自定义用户提供程序实体的递归角色

问题描述:

我有一个自定义用户提供程序实体,允许我连接用户。这个自定义用户提供者实体根据这个接口实现UserInterface我有一个“getRoles()”函数,它给了我用户的角色。自定义用户提供程序实体的递归角色

但我的角色是递归的。 示例:用户获得角色1,角色1继承角色2,以便用户获得角色1和角​​色2。为了实现这种递归性,我创建了一个角色表,一个role_role表(父/子),一个用户表以及一个user_role表。

要获得所有用户的角色,我必须查询我的数据库与教条,以便我可以从哪里做到这一点? 它似乎被禁止从实体查询,我不能把查询放在实体库分类,因为我不能覆盖实体的“getRoles()”,它似乎不是一个好主意来访问存储库表单实体。

P.-S .:谢谢你对我的语法沉迷,这是我的第一封英文信息(我是法语)。

解决方案是充分利用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访问您的角色。

在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