使用不同于密码的字段进行 HTTP Basic 身份验证

在 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())


(顺便说一下,当提供密码而不是短信代码时,身份验证效果很好)


慕神8447489
浏览 78回答 1
1回答

精慕HU

为了保持逻辑(和代码)流程相同,您当前已经将哈希密码作为目标变量,因此当您生成短信代码时,您可以将短信代码的哈希版本添加到数据库中以用作哈希密码值的替代品。然后,当使用 HTTPAuth 时,您可以简单地引用此“hashedSMS”字符串而不是哈希密码字符串,以进行比较。注意:为了安全;SMScode 应具有足够的熵,因此应足够长 - 通常长于 8 个字符。通常,在当前的生态系统中,短信代码比密码更短、更简单,而且由于它们的传输方法(通过手机短信)极其不安全且容易被窃听和拦截,这使代码成为应用程序安全性的弱点。这种身份验证方法只能作为最后的手段。也作为最后的旁注;许多网站使用 SMS 代码作为“双因素身份验证”方法,尽管这不是 2FA,而且这种形式的身份验证很容易被滥用和泄露。事实上,大多数大型网络企业询问您的手机号码只是为了“安全”,实际上只是为了收集电话号码以与您的帐户连接以用于自己的跟踪和营销目的,同时声称这是某种形式的“更好的安全性” ”。
打开App,查看更多内容
随时随地看视频慕课网APP