我从Symfony 3开始,我需要一些关于如何继续实现动态授权和身份验证过程的指导。
首先,身份验证大部分都完成了,我根据symfony文档中的这个链接完成了:http://symfony.com/doc/current/security/entity_provider.html.我还不知道如何实现接口函数getRoles()
以便从数据库返回值(我有一个与User表相关的表Role)。
第二,授权部分。我的应用程序将要求最终用户创建自己的访问机制,换句话说,我有一个界面,用户可以在其中创建角色,然后定义该角色可以访问的页面以及它将拥有的权限(创建、读取、更新、删除等)。然后,这些角色将归属于应用程序用户。
总而言之,这是非常标准的东西,所以Symfony必须有一个干净的方法来做这件事。到目前为止,我发现我必须使用ACL,所以我按照文档中的方式做了:http://symfony.com/doc/current/security/acl.html
我诚实的问题是:现在怎么办?我应该采取哪些步骤来完全实现身份验证机制?为了持久化和检索访问规则,我现在应该做什么?如何将它们与用户角色联系起来?
附言:这个问题可能与这里的其他一些问题有点重复,但说实话,这些问题对我也没有帮助,我在文档中的搜索也没有帮助。
因此,您的问题非常宽泛。不管怎样,这是一个很好的问题,所以我要试着回答。
认证
这里没有什么要说的,我只是希望你按照文章本身的建议使用FOSUserBundle:这是在Symfony中实现注册/登录系统的最佳方式,它将让你了解整个过程的工作原理。如果你不是一个经验丰富的Symfony开发人员,从头开始似乎不是最好的主意。
试试FOSUserBundle
授权过程
关于授权,你基本上有两种选择:使用Voters和使用ACL。
根据我的经验,最好的选择是使用Voters
。
事实上,在大多数情况下,用户和他有权访问的对象之间的实体中都有双向引用(请参阅条令的文档)。在这种情况下,不需要甚至不鼓励ACL。
事实上,ACL只不过是在两个对象(用例中的User和Article)之间创建一种关系。要管理此关系,它使用数据库中的表,因此必须查询它以获取关系并检查授权权限。
但是,如果您已经在您的实体中直接在用户和文章/组之间建立了双向引用,那么您已经建立了这种关系,因此您可以使用Voters,并且ACL的使用是多余的,甚至是不鼓励的,因为它是无用的重复。
如果你的实体中没有这种双向关系,那么就创建它:它在未来肯定会对其他事情有用,而且,无论如何,你将能够直接从实体树访问链接的实体!
此外,在您的场景中,您不能使用ACL,因为您将对对象拥有自定义权限/特权:同样,投票者是构建此类内容的最佳选择。
不要使用ACL,而是使用Voters
如何进行
我要做的第一件事是在interface
中列出所有可用的权限:毕竟,它们与您的应用程序业务逻辑严格相关,因为用户不可能让某人做您的应用无法做的事情:如果您的应用没有实现编辑流,那么用户就不可能给某人编辑文章的能力。这是显而易见的。
所以,像这样的东西可能是好的:
interface PrivilegesEnum
{
const CREATE = 1;
const EDIT = 2;
const DELETE = 4;
const READ = 8;
const OTHER = 16;
// ... Other privileges
}
正如你所看到的,我为每个特权都给定了一个数值:这将使你能够使用比特掩码,这是一种非常强大的机制来管理这类事情:它允许你只使用数据库中的一个字段来列出所有特权。
你可以在这里阅读更多关于比特掩码的信息:
- https://www.google.it/search?q=bitmask+php+示例
- 如何在php中实现位掩码
- 为什么我应该在PHP中使用bitwise/bitmask
- http://alanhollis.com/a-quick-guide-to-using-bitmasks-for-permissions-in-php/
https://codereview.stackexchange.com/questions/1509/php-bitmask-class
https://www.google.it/search?q=php+比特掩码+理论
- 如何在php中实现位掩码
- http://php.net/manual/en/language.operators.bitwise.php
- http://php.net/manual/it/language.operators.bitwise.php
- https://code.tutsplus.com/articles/understanding-bitwise-operators--active-11301
- https://code.tutsplus.com/articles/number-systems-an-introduction-to-binary-hexadecimal-and-more--active-10848
我过去使用过这个系统,这些是我收集的一些有用的链接。他们可能会帮助你!
建立一个列出特权的表格
您可能会发现另一件有用的事情是FormType
来列出您的可用权限:您可以编写一个简单的自定义FormType
来完成此操作。
如何管理角色
要管理角色,请阅读安全组件和FOSUserBundle(堆栈溢出)中的角色管理方式
用户与组和文章之间的关系
一旦你达到了这一点,你应该有更多的实体,阅读更多关于条令关系机制的信息,更好地了解它,你应该能够将你的用户与他们的角色、他们的团队和文章联系起来。
无论如何,您将拥有所需的所有概念和实用工具,以便更好地思考您的具体实现。
最终注释
正如您所看到的,实现这种类型的授权过程并不是那么简单。
我建议你仔细考虑在你的应用程序开发的这个阶段是否真的需要它,因为如果你将来可以推迟它,那么我建议你这样做。
如果你想尽快上线,实现这个系统将需要大量的时间来学习、实现、调试和重新编写代码(我说的是几周,而不是几天!)。
所以,如果你有所有的时间,那么,去实现这个系统。但如果你觉得你没有一直这样做,那就用一个更"静态"的系统,上网,然后让它更"动态"。
毕竟,这是精益创业时代!
祝你好运!