繁体   English   中英

如何为我的symfony2网站实现权限角色/组系统

[英]How to implement a permission roles/groups system for my symfony2 website

[问题]对于任何能够参与并提供想法的人来说,这更像是一场头脑风暴。 我想首先解释一下我想做什么,我的一些想法,并希望得到一些好的想法,如何解决这个问题。

  1. [问题]我想为我的网站实现一个权限系统。 该站点将具有用户登录系统,该系统将允许管理员用户操纵系统中所有其他用户的权限。 系统将具有视图,编辑,创建和删除等基本权限,可能还有一些其他权限。 此外,这些权限将按用户角色分组。 因此,例如,创建,编辑,删除和查看的权限将与系统中的管理员角色相关联,但非管理员角色将仅与权限“视图”相关联。

  2. [我一直在调查]我一直在研究的一个想法是使用访问控制列表。 我可以创建一个接口,允许用户将权限关联到组,然后将这些组附加到系统中的用户。 我不确定实际上ACL的实现情况如何。

  3. 在symfony2框架中实现此类系统的最佳方法是什么?

[更新]如前所述,但我还需要一个允许我动态创建角色权限并将其分配给用户的系统。 此外,我需要一种简单的方法来检查系统中的这些权限,以增加控制器和模板呈现的行为方式。

**如果我的帖子有错误或错误的帖子,请提供正确的位置来发布此帖子

只需使用FOSUserBundle即可让您完全按照自己的意愿行事。

您将为用户和管理员创建角色。

您可以使用Symfony轻松实现上面提到的权限系统。 为用户创建不同的角色,例如ROLE_MANAGER,ROLE_USER,并根据用户角色限制对特定路径的访问。 例如,只有用户拥有ROLE_MANAGER时才能访问/ admin / *。

Symfony的文档详细介绍了所有这些概念。 您可以点击此处访问文档。

我已经实现了几个管理员用户角色,管理员可以在其中分配和删除角色。 至于动态创造新角色还没有那样做。 我相信虽然您可以完成所提供角色所需的一切

路线您可以像Praveesh建议的那样保护路线。 您可以从一个管理页面分配这些角色,其中一个用户循环由ROLE_ADMIN访问,然后在您的树枝中进行类似的操作

                     <td>
                        {% if 'ROLE_NS' in user.roles %}
                            <form action="{{ path('admin_remove',{'id':user.id}) }}" method="post" name="overview">
                                <input type="hidden" name="role" value="ROLE_NS" />
                                <button type="submit" class="btn btn-danger btn-xs"  value="demote">demote </button>
                            </form>
                        {% else %}
                            <form action="{{ path('admin_add',{'id':user.id}) }}" method="post" name="overview">
                                <input type="hidden" name="role" value="ROLE_NS" />
                                <button type="submit" class="btn btn-success btn-xs"  value="demote">promote </button>
                            </form>
                        {% endif %}
                    </td>
                    <td>
                        {% if 'ROLE_ADMIN' in user.roles %}
                            <form action="{{ path('admin_remove',{'id':user.id}) }}" method="post" name="overview">
                                <input type="hidden" name="role" value="ROLE_ADMIN" />
                                <button type="submit" class="btn btn-danger btn-xs"  value="demote">demote </button>
                            </form>
                        {% else %}
                            <form action="{{ path('admin_add',{'id':user.id}) }}" method="post" name="overview">
                                <input type="hidden" name="role" value="ROLE_ADMIN" />
                                <button type="submit" class="btn btn-success btn-xs"  value="demote">promote </button>
                            </form>
                        {% endif %}
                    </td>

和控制器类似

 /**
 *@Route("/add/{id}", name="admin_add")
 *@Method({"GET","POST"})
 */
public function addAction(Request $request, \AppBundle\Entity\User $user)
{
   // var_dump($user);
    $role = $request->request->get('role');
    $em = $this->getDoctrine()->getManager();
    $user->addRole($role);
    $em->persist($user);
    $em->flush();

    return $this->redirectToRoute('admin');
}

/**
 * @Route("/remove/{id}", name="admin_remove")
 *
 */
public function removeAction(Request $request, \AppBundle\Entity\User $user)
{
    $role = $request->request->get('role');
    $em = $this->getDoctrine()->getManager();
    $user->removeRole($role);
    $em->persist($user);
    $em->flush();

    return $this->redirectToRoute('admin');
}

至于他们是否可以创建更新视图删除,我会使用ACL查看我的问题

ACL保护实体实体

尽管我可以看到使用ACL,但这意味着您需要在每条路线上进行更多检查

$authorizationChecker = $this->get('security.authorization_checker');
  if(false == $authorizationChecker->isGranted('VIEW',$organisation) ){
    throw new AccessDeniedException();
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM