我刚刚开始使用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?这里有安全考虑吗?
答案 0 :(得分:3)
此问题已在此处讨论过:
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'));
}
}
答案 1 :(得分:0)
这是来自fromAccount()
class:{/ p>的Symfony\Component\Security\Acl\Domain\UserSecurityIdentity
方法的实现
public static function fromAccount(UserInterface $user)
{
return new self($user->getUsername(), ClassUtils::getRealClass($user));
}
我认为这是你问题的答案。