我从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。:这个问题可能与其他一些问题有些重复,但事实是,这些问题对我没有帮助,也没有在文档中进行清理。
答案 0 :(得分:3)
所以,你的问题很广泛。无论如何,这是一个很好的问题,所以我将尝试回复。
认证
这里没什么可说的,我只是希望您按照文章本身的建议使用FOSUserBundle:这是在Symfony中实现注册/登录系统的最佳方式,它将让您了解整个过程的工作原理。如果您不是Symfony经验丰富的开发人员,从头开始似乎不是最好的主意。
授权流程
关于授权,您基本上有两种选择:使用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
}
正如您所看到的,我为每个权限赋予了一个数值:这将使您能够使用位掩码,这是一种非常强大的机制来管理这类事情:它允许您只使用一个数据库中的字段列出所有权限。
您可以在此处阅读有关位掩码的更多信息:
https://codereview.stackexchange.com/questions/1509/php-bitmask-class
我过去使用过这个系统,这些是我收集的一些有用的链接。他们可能会帮助你!
建立表格以列出特权
您可能觉得有用的另一件事是FormType
列出您的可用权限:您可以写一个简单的custom FormType
。
如何管理角色
管理阅读how Roles are managed by the Security Component和FOSUserBundle(on Stackoverflow)
中的角色用户与群组和文章之间的关系
一旦你到达这一点,你应该有更多的实体,阅读更多关于更好地了解它的学说关系机制,你应该能够将你的用户与他们的角色,他们的小组和文章联系起来。
无论如何,您将拥有在具体实施时更好地思考所需的所有必要概念和实用工具。
最终注释
如您所见,实施此类型授权流程的方式并非如此简单。
我建议你仔细考虑是否真的需要在你的应用程序开发的这个阶段,因为如果你将来推迟它,那么我建议你这样做。
如果你想尽快上网,实施这个系统将需要大量的时间来学习,实施,调试和重构代码(我说的是几周,而不是几天!)。
所以,如果你有这么多时间,那么,去实现这个系统。但是,如果你觉得自己一直都没有,那么请选择更多&#34;静态&#34;系统,上网,然后使它更具动态&#34;。
毕竟,这是Lean Startup era!
祝你好运!