我想知道是否有人知道使用 Symfony2 ACL 系统实现这一目标的优雅方法。
我有一个 Comment
需要由 ROLE_USER
编辑的实体(我的域对象)但这只能在发表评论后的 5 分钟内进行 - 否则评论只能由 ROLE_ADMIN
编辑.
使其只能由 ROLE_USER
编辑和 ROLE_ADMIN
很简单,做一个RoleSecurityIdentity
对于每个。
现在,当我想合并 ROLE_USER
的时间因素时,我的问题就出现了。 .我的第一个问题是它需要来自域对象的信息,而不仅仅是 ACL 表,但我认为这可以通过自定义 ObjectIdentity
来解决。 class里面还可以容纳Comment
的时间被张贴。
现在是困难的部分
我想我需要创建一个自定义 PermissionGrantingStrategy
知道还要查看创建时间。这必须在 Comment
时加载正在检查类型,但我不知道如何加载它。有谁知道是否有某种工厂可以配置这种东西?这样如果一个实体有一个特定的 PermissionGrantingStrategy
与它相关联然后它被使用,否则使用默认值?
我知道这有点长,如果有人知道如何实现这一点,非常感谢,因为 ACL 文档目前似乎有点稀疏。我的后备解决方案是简单地提供某种服务来检查是否可以编辑评论,而根本不打扰 ACL。
最佳答案
你考虑过使用选民吗?有一个 cookbook recipe用于实现 IP 黑名单投票器,但可以轻松修改它以处理对 Comment 对象的编辑检查。
您可以在 Symfony\Component\Security\Acl\Voter\AclVoter
查看默认的 AclVoter (在线 here),虽然你的显然可以增加而不是替换它并且更简单。
作为概念的快速证明:
class CommentTimestampVoter implements VoterInterface
{
public function supportsAttribute($attribute)
{
return 'edit' === $attribute;
}
public function vote(TokenInterface $token, $object, array $attributes)
{
// 1. check if $token->getUser() has ROLE_ADMIN and return VoterInterface::ACCESS_GRANTED if so
// 2. check if $token->getUser() equals $object->getAuthor() and return VoterInterface::ACCESS_DENIED if not
// 3. check that $object->getCreatedAt() is within the window allowed for editing and return VoterInterface::ACCESS_GRANTED if so
// 4. return VoterInterface::ACCESS_DENIED
}
public function supportsClass($class)
{
return 'Acme\CommentBundle\Entity\Comment' === $class;
}
}
关于Symfony2 ACL 结合另一个标准,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7879173/