在 symfony ACL 中禁用对象身份检查
Disable object identity check in symfony ACL
我使用我根据 this guide 设置的选民(我知道它是奏鸣曲指南,但它不使用奏鸣曲代码)。
现在选民工作正常,他们根据需要授予拒绝。一个选民服务定义如下所示:
services:
acme_account.security.authorization.organisation_voter:
class: %acme_account.security.authorization.organisation_voter.class%
arguments: [@service_container]
public: false
tags:
- { name: security.voter }
现在我的问题是,即使投票者 returns 正确授予权限,在某些情况下,某些默认 ACL 处理程序也会拒绝权限。这是在日志中:
security.DEBUG: No ACL found for the object identity. Voting to deny access. [] []
因为我想强制执行来自选民的拒绝,所以我将 security.access_decision_manager.strategy
设置为 unanimous
。但是由于这种方式的默认处理程序,权限被拒绝。
现在我当然可以配置并开始使用 ACL,但在这个应用程序中这会有点矫枉过正,这就是我选择选民的原因。
有什么方法可以禁用此默认行为吗?
这里有一个解决方法,不确定这是否是最好的方法,但它确实有效。
对象和安全身份检索策略服务需要用 noop 实现覆盖。
services.yml
security.acl.object_identity_retrieval_strategy:
class: Acme\UserBundle\Acl\ObjectIdentityRetrievalStrategy
security.acl.security_identity_retrieval_strategy:
class: Acme\UserBundle\Acl\SecurityIdentityRetrievalStrategy
Acme\UserBundle\Acl\ObjectIdentityRetrievalStrategy.php
<?php
namespace Acme\UserBundle\Acl;
use Symfony\Component\Security\Acl\Model\ObjectIdentityRetrievalStrategyInterface;
class ObjectIdentityRetrievalStrategy implements ObjectIdentityRetrievalStrategyInterface
{
public function getObjectIdentity($domainObject)
{
}
}
Acme\UserBundle\Acl\SecurityIdentityRetrievalStrategy.php
<?php
namespace Acme\UserBundle\Acl;
use Symfony\Component\Security\Acl\Model\SecurityIdentityRetrievalStrategyInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
class SecurityIdentityRetrievalStrategy implements SecurityIdentityRetrievalStrategyInterface
{
public function getSecurityIdentities(TokenInterface $token)
{
}
}
我使用我根据 this guide 设置的选民(我知道它是奏鸣曲指南,但它不使用奏鸣曲代码)。
现在选民工作正常,他们根据需要授予拒绝。一个选民服务定义如下所示:
services:
acme_account.security.authorization.organisation_voter:
class: %acme_account.security.authorization.organisation_voter.class%
arguments: [@service_container]
public: false
tags:
- { name: security.voter }
现在我的问题是,即使投票者 returns 正确授予权限,在某些情况下,某些默认 ACL 处理程序也会拒绝权限。这是在日志中:
security.DEBUG: No ACL found for the object identity. Voting to deny access. [] []
因为我想强制执行来自选民的拒绝,所以我将 security.access_decision_manager.strategy
设置为 unanimous
。但是由于这种方式的默认处理程序,权限被拒绝。
现在我当然可以配置并开始使用 ACL,但在这个应用程序中这会有点矫枉过正,这就是我选择选民的原因。
有什么方法可以禁用此默认行为吗?
这里有一个解决方法,不确定这是否是最好的方法,但它确实有效。
对象和安全身份检索策略服务需要用 noop 实现覆盖。
services.yml
security.acl.object_identity_retrieval_strategy:
class: Acme\UserBundle\Acl\ObjectIdentityRetrievalStrategy
security.acl.security_identity_retrieval_strategy:
class: Acme\UserBundle\Acl\SecurityIdentityRetrievalStrategy
Acme\UserBundle\Acl\ObjectIdentityRetrievalStrategy.php
<?php
namespace Acme\UserBundle\Acl;
use Symfony\Component\Security\Acl\Model\ObjectIdentityRetrievalStrategyInterface;
class ObjectIdentityRetrievalStrategy implements ObjectIdentityRetrievalStrategyInterface
{
public function getObjectIdentity($domainObject)
{
}
}
Acme\UserBundle\Acl\SecurityIdentityRetrievalStrategy.php
<?php
namespace Acme\UserBundle\Acl;
use Symfony\Component\Security\Acl\Model\SecurityIdentityRetrievalStrategyInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
class SecurityIdentityRetrievalStrategy implements SecurityIdentityRetrievalStrategyInterface
{
public function getSecurityIdentities(TokenInterface $token)
{
}
}