为啥 Symfony2 ACL 使用用户名而不是 ID?

Posted

技术标签:

【中文标题】为啥 Symfony2 ACL 使用用户名而不是 ID?【英文标题】:Why does Symfony2 ACL go by username instead of ID?为什么 Symfony2 ACL 使用用户名而不是 ID? 【发布时间】:2013-09-25 22:34:21 【问题描述】:

我刚开始使用 Symfony 的 ACL 系统,想知道为什么 UserSecurityIdentity 使用 username 而不是 User 对象的 id 来确定它的身份?

$user = new User();
$user->setId(new \MongoId());
$user->setUsername("frodo");
$dm->persist($user);

$uid = UserSecurityIdentity::fromAccount($user); // uses "frodo"

我们的系统允许用户更改他们的用户名,因此使用更永久的东西(如 ID)来确定用户的身份对我来说似乎更合适。为什么 ACL 系统实施为使用用户名而不是 ID?这里有什么安全注意事项吗?

【问题讨论】:

【参考方案1】:

这里已经讨论过这个问题:

https://github.com/symfony/symfony/issues/5787

并且已经在本次提交中解决了:

https://github.com/symfony/symfony/commit/8d39213f4cca19466f84a5656a199eee98602ab1

因此,现在,每当用户更改其用户名时,您都可以更新其安全身份。我使用监听器来做到这一点:

public function preUpdate(PreUpdateEventArgs $eventArgs)

        /** Update user security identity in case nick is changed * */
        if ($entity instanceof \Acme\UserBundle\Entity\User && $eventArgs->hasChangedField('username')) 
            $aclProvider = $this->container->get('security.acl.provider');
            $securityId = UserSecurityIdentity::fromAccount($entity);
            $aclProvider->updateUserSecurityIdentity($securityId, $eventArgs->getOldValue('username'));
        

【讨论】:

【参考方案2】:

这是来自Symfony\Component\Security\Acl\Domain\UserSecurityIdentity 类的fromAccount() 方法的实现:

public static function fromAccount(UserInterface $user)

    return new self($user->getUsername(), ClassUtils::getRealClass($user));

我认为这是对您问题的回答。

【讨论】:

我已经看到了实现。问题是他们为什么这样做而不是使用 ID。使用 ID 而不是用户名是否有任何安全隐患。他们还创建了该类final,因此甚至不能重写它来进行自定义实现。 @anushr 也许 Fabien Potencier 可以问为什么? ;) 顺便说一句,我认为使用非 unic 用户名 - 不是好习惯。

以上是关于为啥 Symfony2 ACL 使用用户名而不是 ID?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 symfony2 安全选民总是被召唤?

Symfony 2 ACL 与选民

Symfony2 ACL 结合另一个条件

Symfony2 ACL 问题

如何在 Symfony2 中制作高级 ACL?

ACL(访问控制列表)Codeigniter 按用户 ID 而不是按角色