在 Symfony 5 项目中,我有一个用户实体,其中包含“ password ”(散列)和“ smsCode ”(纯文本)字段。
创建帐户时,首先使用smsCode进行身份验证,直到用户稍后设置密码(然后我们在不为空时使用密码并忽略smsCode)。
我想要实现的目标:通过 HTTP Basic 进行身份验证,但使用 smsCode 而不是哈希密码。
我设法通过编辑 LoginFormAuthenticator 上的功能,使用表单登录来完成这项工作checkCredentials():我可以使用短信代码而不是密码通过表单登录。
但是,当我尝试通过 HTTP Basic 进行身份验证时,checkAuthentication()会调用 DaoAuthenticationProvider.php 上的函数,并且此类会使用$user->getPassword(). 有什么方法可以覆盖/扩展此checkAuthentication()函数,以便我可以首先检查纯 smsCode ( $user->getSmsCode()) 而不是哈希密码?
#security:
encoders:
App\Entity\User:
algorithm: auto
providers:
# used to reload user from session & other features (e.g. switch_user)
app_user_provider:
entity:
class: App\Entity\User
property: email
firewalls:
dev:
# profiler (dev only)
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: true
lazy: true
provider: app_user_provider
http_basic: true
guard:
authenticators:
- App\Security\LoginFormAuthenticator
logout:
path: app_logout
我尝试编辑我的getPassword()函数以首先检查短信代码:
public function getPassword(): string
{
if (!empty($this->smsCode)) {
return (string) $this->smsCode;
} else {
return (string) $this->password;
}
}
不幸的是,由于密码是经过哈希处理的,因此它在身份验证时不断失败,因为它正在寻找 smsCode 的哈希版本(DaoAuthenticationProvider.php 中的函数isPasswordValid())
(顺便说一下,当提供密码而不是短信代码时,身份验证效果很好)
精慕HU