gpt4 book ai didi

php - 如何使用Symfony2中的AccessDecisionManager来授权任意用户?

转载 作者:可可西里 更新时间:2023-10-31 22:10:18 25 4
gpt4 key购买 nike

我希望能够验证属性(角色)是否被授予在 Symfony2 中实现 UserInterface 的任意对象。这可能吗?

UserInterface->getRoles() 不适合我的需求,因为它没有考虑角色层次,我宁愿不在那个部门重新发明轮子,这就是为什么我如果可能,我想使用 Access Decision Manager。

谢谢。

针对下面 Olivier 的解决方案,以下是我的经验:

You can use the security.context service with the isGranted method. You can pass a second argument which is your object.

$user = new Core\Model\User();
var_dump($user->getRoles(), $this->get('security.context')->isGranted('ROLE_ADMIN', $user));

输出:

array (size=1)
0 => string 'ROLE_USER' (length=9)

boolean true

我的角色层次结构:

role_hierarchy:
ROLE_USER: ~
ROLE_VERIFIED_USER: [ROLE_USER]
ROLE_ADMIN: [ROLE_VERIFIED_USER]
ROLE_SUPERADMIN: [ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
ROLE_ALLOWED_TO_SWITCH: ~

我的UserInterface->getRoles() 方法:

public function getRoles()
{
$roles = [$this->isVerified() ? 'ROLE_VERIFIED_USER' : 'ROLE_USER'];

/**
* @var UserSecurityRole $userSecurityRole
*/
foreach ($this->getUserSecurityRoles() as $userSecurityRole) {
$roles[] = $userSecurityRole->getRole();
}

return $roles;
}

ROLE_ADMIN 必须显式分配,但 isGranted('ROLE_ADMIN', $user) 返回 TRUE,即使用户刚刚创建并且除了默认的 ROLE_USER 之外,没有分配任何角色,只要当前登录的用户被授予 ROLE_ADMIN。这让我相信 isGranted() 的第二个参数被忽略了,TokenSecurityContext 被改用。

如果这是一个错误,我会提交一份报告,但也许我仍然做错了什么?

最佳答案

为此,您只需要 AccessDecisionManager,不需要安全上下文,因为您不需要身份验证。

$user = new Core\Model\User();

$token = new UsernamePasswordToken($user, 'none', 'none', $user->getRoles());
$isGranted = $this->get('security.access.decision_manager')
->decide($token, array('ROLE_ADMIN'));

这将正确地考虑角色层次结构,因为默认情况下注册了 RoleHierarchyVoter

更新

正如@redalaanait 所指出的,security.access.decision_manager 是一项私有(private)服务,因此直接访问它并不是一件好事。最好使用service aliasing ,它允许您访问私有(private)服务。

关于php - 如何使用Symfony2中的AccessDecisionManager来授权任意用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11288293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com