Symfony3授权流程

时间:2017-01-10 01:01:24

标签: php doctrine-orm symfony

我从Symfony 3开始,我需要一些关于如何继续实施动态授权和身份验证的指导。

首先,身份验证位大部分都已完成,我已根据symfony docs http://symfony.com/doc/current/security/entity_provider.html中的链接完成了此操作。我还要了解的是如何实现接口函数 getRoles() 以便从数据库返回一个值(我有一个与User表相关的表Role)。

其次,授权部分。我的应用程序将要求最终用户创建自己的访问机制,换句话说,我有一个用户创建角色的界面,然后定义角色将能够访问的页面以及它将拥有的权限(创建,读取,更新,删除等)。之后,角色将归属于应用程序用户。

总而言之,它是非常标准的东西,所以Symfony必须有一个干净的方法来做到这一点。到目前为止我想到的是我必须使用ACL,所以我在文档中做了:http://symfony.com/doc/current/security/acl.html

我的诚实问题是:现在怎么办?我将采取哪些步骤来完全实现身份验证机制?为了坚持和检索访问规则,我现在应该怎么做?如何将它们与用户角色相关联?

P.S。:这个问题可能与其他一些问题有些重复,但事实是,这些问题对我没有帮助,也没有在文档中进行清理。

1 个答案:

答案 0 :(得分:3)

所以,你的问题很广泛。无论如何,这是一个很好的问题,所以我将尝试回复。

认证

这里没什么可说的,我只是希望您按照文章本身的建议使用FOSUserBundle:这是在Symfony中实现注册/登录系统的最佳方式,它将让您了解整个过程的工作原理。如果您不是Symfony经验丰富的开发人员,从头开始似乎不是最好的主意。

尝试FOSUserBundle

授权流程

关于授权,您基本上有两种选择:使用Voters和使用ACL

根据我的经验,最好的选择是使用Voters

在大多数情况下,实际上,您将在用户和他拥有权利的对象之间的实体中具有双向引用(请参阅Doctrine' s documentation about this)。在这种情况下,ACL不是必需的,甚至不鼓励。

实际上,ACL只是创建两个对象(用户和用例中的文章)之间的关系。要管理这种关系,它会使用数据库中的表格,因此必须查询以获取关系并检查授权权限。

但是如果您已经在您的实体中直接在用户和文章/组之间进行双向引用,那么您已经建立了这种关系,因此您可以使用选民,并且使用ACL是多余的,甚至如此说,气馁,因为这是一个无用的重复。

如果你在你的实体中没有这种双向关系,那么创建它:它将来肯定对其他东西很有用,无论如何,你将有能力直接从你的实体访问你的链接实体你的实体树!

此外,在您的方案中,您无法使用ACL,因为您将拥有对象的自定义权限/权限:选民也是构建此类事物的最佳选择。

<强> Don't use ACL, but Voters instead

如何进行

我要做的第一件事就是列出interface所有可用的权限:毕竟,它们与您的应用程序业务逻辑严格相关,因为用户无法使某人能够做一些你的应用程序无法做的事情:如果你的应用程序没有实现编辑流程,那么用户就无法给某人编辑文章的能力。这很明显。

所以,这样的事情可能会很好:

interface PrivilegesEnum
{
   const CREATE = 1;
   const EDIT   = 2;
   const DELETE = 4;
   const READ   = 8;
   const OTHER  = 16;
   // ... Other privileges
}

正如您所看到的,我为每个权限赋予了一个数值:这将使您能够使用位掩码,这是一种非常强大的机制来管理这类事情:它允许您只使用一个数据库中的字段列出所有权限。

您可以在此处阅读有关位掩码的更多信息:

我过去使用过这个系统,这些是我收集的一些有用的链接。他们可能会帮助你!

建立表格以列出特权

您可能觉得有用的另一件事是FormType列出您的可用权限:您可以写一个简单的custom FormType

如何管理角色

管理阅读how Roles are managed by the Security ComponentFOSUserBundleon Stackoverflow

中的角色

用户与群组和文章之间的关系

一旦你到达这一点,你应该有更多的实体,阅读更多关于更好地了解它的学说关系机制,你应该能够将你的用户与他们的角色,他们的小组和文章联系起来。

无论如何,您将拥有在具体实施时更好地思考所需的所有必要概念和实用工具。

最终注释

如您所见,实施此类型授权流程的方式并非如此简单。

我建议你仔细考虑是否真的需要在你的应用程序开发的这个阶段,因为如果你将来推迟它,那么我建议你这样做。

如果你想尽快上网,实施这个系统将需要大量的时间来学习,实施,调试和重构代码(我说的是几周,而不是几天!)。

所以,如果你有这么多时间,那么,去实现这个系统。但是,如果你觉得自己一直都没有,那么请选择更多&#34;静态&#34;系统,上网,然后使它更具动态&#34;。

毕竟,这是Lean Startup era

祝你好运!