2017-01-10 59 views
3

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

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

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

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

我的诚实问题是:现在是什么?我采取了哪些步骤来全面实施身份验证机制?我现在应该怎么做才能坚持和检索访问规则?我如何将它们与用户角色联系起来?

P.S .:这个问题可能与这里的其他一些问题有所重复,但事实被告知,这些问题也没有帮助我,也没有在文档中找到我。

回答

3

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

认证

没有在这里说,我只是希望你用FOSUserBundle文章本身的建议:为实现在Symfony的注册/登录系统的最佳方式,它会给你一个想法整个过程如何工作。从头开始如果你不是Symfony,有经验的开发人员似乎不是最好的主意。

FOSUserBundle试试吧!

授权过程

关于授权主要通过两种选择:使用Voters和使用ACL

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

实际上,在大多数情况下,您将在您的实体和用户之间实现双向引用(请参阅Doctrine的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

用户和组文章

一旦你达到这一点,你应该之间的关系有更多的实体,阅读更多关于教义关系机制的知识,并且你应该能够将你的用户与他们的角色联系起来埃尔集团和文章。

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

最后要注意

正如你可以看到,实现这种类型的授权过程是多么的不那么简单。

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

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

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

毕竟,这是Lean Startup era

祝你好运!

+2

缓慢的鼓掌为答案!对于任何对授权/认证主题感兴趣的人来说,这是一个金矿...... –

+0

感谢您的回复,我会尽快回复,我会尽快给您回复。我知道这需要一段时间才能正确实施,但我确实需要它。我已经从头开始用Java做了这件事,但是我没有使用框架,这些框架在完成任何事情的时候都会绑定你。所以我很好地掌握了它背后的逻辑(我实际上是在重做,试图'重写'Symfony的安全配置,但我知道这是不行的)。基本上我只是用Symfony的方式来做到这一点。 – Eduardo

+0

那么,选民......说实话,只是说“使用选民”并不能真正解决我的问题,也许我只是不明白关于他们的文件。我想我意识到了为什么,所以让我问你一个问题:我需要为每个对象创建一个选民吗? – Eduardo