Php 如何在数据库级别动态处理Symfony2中的角色|权限:对它们的CRUD操作

Php 如何在数据库级别动态处理Symfony2中的角色|权限:对它们的CRUD操作,php,symfony,security,acl,Php,Symfony,Security,Acl,我在一个Symfony 2.8项目中工作,我对用户/组/角色的权限有疑问。有几种方法可以处理用户和组,例如在上面和最近,但它们都缺乏角色权限管理,这正是我的疑问:什么是处理它们的正确方法?是的,我知道我需要在security.yml中编写它们,但我不知道是否可以将它们存储在DB(某处)中,然后从那里读取。我对此进行了研究,发现了ACL、选民等等,但这项研究并没有让我头脑清醒,反而让我很困惑,所以我需要这里的人来推动。然后: 你会怎么处理 有代码级的例子吗?(我更喜欢看一些文字以外的东西来理解整

我在一个Symfony 2.8项目中工作,我对用户/组/角色的权限有疑问。有几种方法可以处理用户和组,例如在上面和最近,但它们都缺乏角色权限管理,这正是我的疑问:什么是处理它们的正确方法?是的,我知道我需要在
security.yml
中编写它们,但我不知道是否可以将它们存储在DB(某处)中,然后从那里读取。我对此进行了研究,发现了ACL、选民等等,但这项研究并没有让我头脑清醒,反而让我很困惑,所以我需要这里的人来推动。然后:

  • 你会怎么处理
  • 有代码级的例子吗?(我更喜欢看一些文字以外的东西来理解整个要点)
  • 角色是否与权限相同
更新:改进问题

我想要的是
用户
角色
之间的
manytomy
关系,可能还有
角色
。我认为作为
SonataUserBundle
handle,这是通过在
user
表中创建一列
roles
,并为每个用户分配大量角色来实现的,如果我没有弄错的话,甚至可以创建新的角色,但是如果我想创建尽可能多的角色,而不将它们分配给用户,然后向用户甚至组添加许多角色,那又如何呢


您将如何做到这一点?

您可以随时在
FOSUserBundle
中添加新角色。您无需首先将其添加到
security.yml
文件中

为此,您可以执行以下操作:

$user = new User();
$user->addRole('ROLE_NEWUSER'); //Role Name should begin with 'ROLE_'
或者在控制器中,您可以获取当前或任何用户

$this->getUser();
$user->addRole('ROLE_NEWUSER'); //Role Name should begin with 'ROLE_'
这回答了你的第一和第二部分

对于第三部分,角色可以用作权限。我以前实现过一种结构,在这种结构中,我根据用户角色限制对页面的访问,也限制他们可以根据自己的角色更改哪些数据

UPDATE我为此实现了一个监听所有内核请求的方法,该方法称为
onKernelRequest
。我已经在SQL端部分完成了访问管理,因为我的角色也存储在SQL端,但在服务器端也可以这样做。我的事件监听器如下所示:(这是我的精简版本)

我的服务.yml看起来像这样

services:
    app.tokens.action_listener:
        class: EventListenerBundle\EventListener\TokenListener
        arguments:
            entityManager: "@doctrine.orm.entity_manager"
            token_storage: "@security.token_storage"
            templating: "@templating"
            router: "@router"
            resolver: "@controller_resolver"
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }

更新要回答问题的更新部分,您可以使用另一个
角色
实体,您可以提前填充所需的角色,然后与原始
用户
表建立一对多关系。然后,您可以在添加新角色时检查角色是否已存在于您的角色实体中。这正好解决了你的问题。不过,所有这些都需要进行一些调整。没有直接的方法可以做到这一点。

这取决于您想要如何实现这一点

一种方法:

实现
UserProviderInterface
loadByUsername
(这是加载角色和权限的地方)实现
用户界面(您的
用户


然后实现
VoterInterface
。将此注册为标有
security.voter
的服务,并在security.yml中将其指定为提供者。覆盖
vote
函数,以评估从
TokenInterface
加载的
用户的权限(也可能是角色),这是该函数的第一个参数

你调查过了吗?它将角色存储在数据库中,您可以动态添加角色。@DipenShah是的,它们将角色存储在数据库中(
roles
列在用户表中)但是这些角色需要先手动创建,因为它们是从
security.yml
读取的。也许我错了,但这就是我认为在场景背后发生的事情。你可以随时添加新角色。无需将其添加到
security.yml
file@DipenShah你能告诉我怎么做吗?我的意思是,你有任何与此相关的代码吗?好的,和@dipen shah的问题一样,有任何代码来显示这一点吗?我指的是一个小例子,我只是需要一个开始点——不仅仅是文字;)为了获得您的权限,您可以实现自己的UserOkey,看看OP,我做了一些更改,因为我没有构建自己的用户管理系统,而是使用SonataUserBundle系统,也许我应该从这里开始,以避免混淆。我不确定
SonataUserBundle
这是
FOSUserBundle
的解决方案,正如我前面解释的那样。这不是我自己的系统,只是一个
事件监听器
。好的,即使你的回答帮助我超越了我的视野,我也会等几天,直到接受你的问题,如果你有任何其他想法,请与我分享。我希望索纳塔方面的人能帮助meLook。第一行说它在索纳塔管理项目中集成了
FOS/UserBundle
,并添加了一些功能。因此它基本上是
FOSUserBundle
,上面有一些特性。我很确定您也可以在Sonata用户包上实现我的概念,因为它构建在
FOSUserBundle
之上,您的
TokenListener
是否以某种方式回答了这个问题?你能看一下新的帖子吗?
services:
    app.tokens.action_listener:
        class: EventListenerBundle\EventListener\TokenListener
        arguments:
            entityManager: "@doctrine.orm.entity_manager"
            token_storage: "@security.token_storage"
            templating: "@templating"
            router: "@router"
            resolver: "@controller_resolver"
        tags:
            - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }