gpt4 book ai didi

symfony - 如何在 Symfony2 中使用类范围的 ace?

转载 作者:行者123 更新时间:2023-12-04 02:03:27 24 4
gpt4 key购买 nike

我遇到了类范围 ace 的问题。我创造了一张王牌
像这样的类:

$userIdentity = UserSecurityIdentity::fromAccount($user);
$classIdentity = new ObjectIdentity('some_identifier', 'Class\FQCN');
$acl = $aclProvider->createAcl($classIdentity);
$acl->insertClassAce($userIdentity, MaskBuilder::MASK_CREATE);
$aclProvider->updateAcl($acl);

现在,我正在尝试检查用户的权限。我找到了这种方式
做事,没有记录,但给出了预期的
以类(class)为基础的结果:
$securityContext->isGranted('CREATE', $classIdentity);  // returns true
$securityContext->isGranted('VIEW', $classIdentity); // returns true
$securityContext->isGranted('DELETE', $classIdentity); // returns false

这种方法很好地适应了“CREATE”权限检查,其中
没有可用的对象实例传递给该方法。然而,
应该可以检查是否授予了另一个权限
特定实例基础:
$entity = new Class\FQCN();
$em->persist($entity);
$em->flush();
$securityContext->isGranted('VIEW', $entity); // returns false

这是测试失败的地方。我希望有一个给定的用户
一个类的权限掩码对每个类都具有相同的权限
该类的实例,如文档中所述(“
PermissionGrantingStrategy 首先检查所有对象范围的 ACE,如果
不适用,类范围的 ACE 将被检查"),但它
似乎不是这里的情况。

最佳答案

你做得对。并根据this page的底部,它应该工作,但它没有。

使其工作的最简单方法是创建一个 AclVoter 类:

namespace Core\Security\Acl\Voter;

use JMS\SecurityExtraBundle\Security\Acl\Voter\AclVoter as BaseAclVoter;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Acl\Domain\ObjectIdentity;
use Doctrine\Common\Util\ClassUtils;

class AclVoter extends BaseAclVoter
{
public function vote( TokenInterface $token , $object , array $attributes )
{
//vote for object first
$objectVote = parent::vote( $token , $object , $attributes );

if( self::ACCESS_GRANTED === $objectVote )
{
return self::ACCESS_GRANTED;
}
else
{
//then for object's class
$oid = new ObjectIdentity( 'class' , ClassUtils::getRealClass( get_class( $object ) ) );
$classVote = parent::vote( $token , $oid , $attributes );

if( self::ACCESS_ABSTAIN === $objectVote )
{
if( self::ACCESS_ABSTAIN === $classVote )
{
return self::ACCESS_ABSTAIN;
}
else
{
return $classVote;
}
}
else if( self::ACCESS_DENIED === $objectVote )
{
if( self::ACCESS_ABSTAIN === $classVote )
{
return self::ACCESS_DENIED;
}
else
{
return $classVote;
}
}
}

return self::ACCESS_ABSTAIN;
}
}

然后在 security.yml 中设置:
jms_security_extra:
voters:
disable_acl: true

最后将选民设置为服务:

core.security.acl.voter.basic_permissions:
class: Core\Security\Acl\Voter\AclVoter
public: false
arguments:
- '@security.acl.provider'
- '@security.acl.object_identity_retrieval_strategy'
- '@security.acl.security_identity_retrieval_strategy'
- '@security.acl.permission.map'
- '@?logger'
tags:
- { name: security.voter , priority: 255 }
- { name: monolog.logger , channel: security }

关于symfony - 如何在 Symfony2 中使用类范围的 ace?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8037610/

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