我有一个Symfony 3.3应用程序,用户按照手册存储在数据库中,具有普通的用户实体。
我需要能够以"admin"身份登录(始终是id=2的用户),但使用固定的"主"密码进行硬编码(其哈希值,而不是纯文本)。
所以这个想法是这样的:如果用户名为 tech,密码为 XYZ,则必须登录用户管理员,并且必须设置自定义角色。
我已经尝试了这里描述的方法,我做到了:
public function loadUserByUsername($username)
{
if($username == 'TECH') {
/** @var $user User */
$user = $this->createQueryBuilder('u')
->where('u.username = :username')
->setParameter('username', 'admin')
->getQuery()
->getOneOrNullResult();
$user->setUsername('⭐ TECH');
$user->setPassword('$2y$13$u...');
$user->setIsTech(true);
return $user;
}
return $this->createQueryBuilder('u')
->where('u.username = :username')
->setParameter('username', $username)
->getQuery()
->getOneOrNullResult();
}
在用户实体中:
public function getRoles() : array
{
if($this->isAdmin()) {
if($this->isTech) {
return ['ROLE_TECH', 'ROLE_ADMIN', ...];
}
return ['ROLE_ADMIN', ...];
} else {
return ['ROLE_USER'];
}
}
但它不起作用,用户以管理员身份登录,但未授予ROLE_TECH角色,并且未设置自定义名称(我不知道这是否可能,如果不是,则不是那么重要)
如果您想使用主密码登录,您可以通过在security.yml上创建一个内存用户来实现
in_memory:
memory:
users:
tech: {password: encoded_password, roles:['ROLE_TECH','ROLE_SUPER_ADMIN','.....']}
或者,您可以将其存储在数据库中并为其分配适当的角色。如果您不希望用户/角色可用于任何操作,也可以使用一些布尔属性对其进行标记。你正在使像getRoles()这样的方法对于一个用户来说有点复杂。
否则尝试刷新用户...