Php Symfony3授权流程

Php Symfony3授权流程,php,doctrine-orm,symfony,Php,Doctrine Orm,Symfony,我从Symfony 3开始,我需要一些关于如何继续实现动态授权和身份验证过程的指导 首先,身份验证位主要完成了,我已经根据symfony docs的链接完成了。我还不了解如何实现接口函数getRoles(),以便从数据库返回值(我有一个与用户表相关的表角色) 第二,授权部分。我的应用程序将要求最终用户创建自己的访问机制,换句话说,我有一个界面,用户在其中创建一个角色,然后定义该角色能够访问哪些页面以及它将拥有哪些权限(创建、读取、更新、删除等)。之后,角色归属于应用程序用户 总而言之,这是相当标

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

首先,身份验证位主要完成了,我已经根据symfony docs的链接完成了。我还不了解如何实现接口函数
getRoles()
,以便从数据库返回值(我有一个与用户表相关的表角色)

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

总而言之,这是相当标准的东西,所以Symfony必须有一个干净的方式来做它。到目前为止,我发现我必须使用ACL,所以我像在文档中一样:

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


旁白:这个问题可能有点像其他问题的重复,但说实话,这些问题对我也没有帮助,我在文档中的搜索也没有帮助。

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

身份验证

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

试试看

授权过程

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

根据我的经验,最好的选择是使用投票人

事实上,在大多数情况下,用户和他拥有权利的对象之间的实体中都有一个双向引用(参见原则)。在这种情况下,不需要ACL,甚至不鼓励使用ACL

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

但是,如果您已经在实体中直接在用户和文章/组之间建立了双向引用,那么您已经建立了这种关系,因此您可以使用投票者,而ACL的使用是多余的,正如所说的,甚至是不鼓励的,因为它是无用的重复

如果您的实体中没有这种双向关系,那么就创建它:它在将来肯定会对其他事情有用,而且,无论如何,您将能够直接从实体树访问链接的实体

此外,在您的场景中,您不能使用ACL,因为您将拥有对对象的自定义权限/特权:投票者也是构建此类对象的最佳选择

如何继续

我要做的第一件事是在
界面中列出所有可用的特权:毕竟,它们严格地与您的应用程序业务逻辑相关,因为用户不可能让某人做您的应用程序不能做的事情:如果您的应用程序未实现编辑流,那么,用户就不可能赋予某人编辑文章的能力。很明显

所以,像这样的事情可能是好的:

interface PrivilegesEnum
{
   const CREATE = 1;
   const EDIT   = 2;
   const DELETE = 4;
   const READ   = 8;
   const OTHER  = 16;
   // ... Other privileges
}
如您所见,我为每个权限指定了一个数值:这将使您能够使用位掩码,这是一种非常强大的机制来管理这类事情:它允许您只使用数据库中的一个字段来列出所有权限

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

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

构建一个表单以列出权限

您可能会发现另一件有用的事情是使用
FormType
列出您的可用权限:您可以编写一个简单的

如何管理角色

要在()中管理角色,请执行以下操作

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

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

无论如何,您将拥有在具体实现中更好地思考所需的所有概念和实用工具

最后一个音符

正如您所看到的,实现这种类型的授权过程并不是那么简单

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

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

所以,如果你有所有的时间,那么,去实施这个系统。但如果你觉得自己没有这么多时间,那就用一个更“静态”的系统,上网,然后让它更“动态”

毕竟,这是最重要的

好卢