在 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 關注
- 103 瀏覽
添加回答
舉報
0/150
提交
取消