Symfony2 中 isGranted 的替代方案

Posted

技术标签:

【中文标题】Symfony2 中 isGranted 的替代方案【英文标题】:Alternatives to isGranted in Symfony2 【发布时间】:2012-09-16 16:32:16 【问题描述】:

在我的应用程序中测试角色时,我发现了 SecurityContext 的函数 isGranted。它工作得很好,但现在我需要检查不是当前用户的用户的角色,所以isGranted 对我不起作用。

我一直在寻找,我找到了用户的函数hasRole,问题是这个函数没有在Symfony的层次结构树中查找,它只是在分配给用户的角色中查找。

那么,有没有像isGranted 那样为当前用户在层次结构树中查找用户角色的函数?

编辑

我找到了这个解决方案:

How to use the AccessDecisionManager in Symfony2 for authorization of arbitrary users?

我实现了它并且它有效,问题是它需要ContainerBuilder,我更喜欢不同的方法。

有什么想法吗?

【问题讨论】:

您的角色应该存储在您的数据库中,这样您就可以请求获取与连接的女巫不同的用户的角色(对不起,我不知道是否有方法这个,这只是解决您问题的另一个想法) 我有一个用户列表,根据用户的角色,可以应用的操作会有所不同 【参考方案1】:

基本上 AFAIK SecurityContext 与 Symfony\Component\Security\Core\Authentication\Token\TokenInterface 一起使用,可以使用 getUser 方法从哪里获取当前用户。

如果用户令牌未经过身份验证,则 isGranted 首先尝试验证用户令牌,然后使用名为 AccessDecisionManager 的类,它基本上遍历选民对象并调用它们(并且可以为此使用不同的策略)其中一个被调用的选民是 @ 987654326@ 使用Symfony\Component\Security\Core\Role\RoleHierarchy

所以回答你的问题:

我认为对于其他用户来说没有像 isGranted 这样的功能(或不知道任何功能),但您可以编写自己的服务,允许使用 security.role_hierarchy(请注意这是私人服务)。

顺便说一句hasRole 可能大部分时间都足够了,所以也许你应该考虑一下你想做什么;)

【讨论】:

您好 l3l0,函数 hasRole 不够用,因为我需要查看层次结构树。 你好@graffiacane如果你使用FOSUserBundle你有getRoles这样的方法应该返回所有用户角色见github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Model/…和Model/User::hasRole也应该使用它 嗨 l3L0,也许我解释得不好,但这些函数不会返回用户从层次结构树继承的角色,而只会返回与数据库中的用户相关联的角色。 确实 l3l0 这是我的第一个方法,我的结论与我在问题中提到的解决方案中 Adrian 得到的结论相同。

以上是关于Symfony2 中 isGranted 的替代方案的主要内容,如果未能解决你的问题,请参考以下文章

将对象传递给自定义选民?

Symfony2 通过第 3 方 REST API 进行身份验证

Symfony 2 ACL 与选民

Symfony2 实体字段类型替代“property”或“__toString()”?

SecurityManager.IsGranted() 行为

isGranted 为登录的用户 JWT 返回 false - Symfony API-Platform AWS-EB