在 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: autoproviders: # used to reload user from session & other features (e.g. switch_user) app_user_provider: entity: class: App\Entity\User property: emailfirewalls: 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())(顺便说一下,当提供密码而不是短信代码时,身份验证效果很好)
1 回答
精慕HU
TA贡献1845条经验 获得超8个赞
为了保持逻辑(和代码)流程相同,您当前已经将哈希密码作为目标变量,因此当您生成短信代码时,您可以将短信代码的哈希版本添加到数据库中以用作哈希密码值的替代品。
然后,当使用 HTTPAuth 时,您可以简单地引用此“hashedSMS”字符串而不是哈希密码字符串,以进行比较。
注意:为了安全;SMScode 应具有足够的熵,因此应足够长 - 通常长于 8 个字符。
通常,在当前的生态系统中,短信代码比密码更短、更简单,而且由于它们的传输方法(通过手机短信)极其不安全且容易被窃听和拦截,这使代码成为应用程序安全性的弱点。
这种身份验证方法只能作为最后的手段。
也作为最后的旁注;许多网站使用 SMS 代码作为“双因素身份验证”方法,尽管这不是 2FA,而且这种形式的身份验证很容易被滥用和泄露。
事实上,大多数大型网络企业询问您的手机号码只是为了“安全”,实际上只是为了收集电话号码以与您的帐户连接以用于自己的跟踪和营销目的,同时声称这是某种形式的“更好的安全性” ”。
- 1 回答
- 0 关注
- 77 浏览
添加回答
举报
0/150
提交
取消