2017-10-12 84 views
5

我想使用多字段檢查登錄。CakePHP 3 - 多字段身份驗證登錄

現狀:使用(Email)和(Password)進行登錄

<div> 
    <input placeholder="Email"> 
    <input placeholder="Password"> 
    <input type="submit" value="Login"> 
</div> 

這領域是我的AuthComponent配置:

$this->loadComponent('Auth', [ 
    #Some other configuration 
    'authenticate' => [ 
     'Form' => [ 
      'fields' => ['username' => 'email'] 
     ] 
    ], 
    'storage' => 'Session' 
]); 

我的期望:使用(Email或(Phone)和(Password)進行登錄

<div> 
    <input placeholder="Email or Phone"> 
    <input placeholder="Password"> 
    <input type="submit" value="Login"> 
</div> 

字段如何配置AuthComponent滿足這種情況呢?

+1

你投入甚至沒有'name'屬性,即瀏覽器將不會提交任何數據。您應該先使用表單助手來構建表單。 – ndm

+0

是的!我知道。謝謝。這僅僅是一個例子。我使用了「Form Helper」,但是多個字段不適合我。 :(@ndm –

+0

我看到了,你應該用你的實際代碼更新這些例子,因爲這樣只會混淆人們的注意力並分散他們的實際問題 – ndm

回答

2

如果你想基於一個「非此即彼」的基礎上進行身份驗證,那麼你必須使用自定義的取景器,如內置的取景器身份驗證程序僅用於匹配單個列。

在表單定義輸入:

<?= $this->Form->input('email_or_phone'); ?> 

在您的身份驗證配置設置中的字段和取景器:

$this->loadComponent('Auth', [ 
    'authenticate' => [ 
     'Form' => [ 
      'fields' => [ 
       'username' => 'email_or_phone' 
      ], 
      'finder' => 'auth' 
     ] 
    ] 
]); 

在你(可能UsersTable)表類定義的取景器,在那裏你可以使用username選項來建立所需要的條件:

public function findAuth(\Cake\ORM\Query $query, array $options) 
{ 
    return $query->where(
     [ 
      'OR' => [ 
       $this->aliasField('email') => $options['username'], 
       $this->aliasField('phone') => $options['username'], 
      ] 
     ], 
     [], 
     true 
    ); 
} 

請注意,認證者通過配置的email_or_phone字段從請求中獲取的值,將始終傳遞給username選項中的查找程序!

另請注意,您必須刪除驗證器生成的可能現有條件,或使用第三個參數Query::where()覆蓋它們(如本例中所示)。

又見

+0

非常感謝您的回答。 <3 <3 –

2

嘗試以下方法:

$this->loadComponent('Auth', [ 
    #Some other configuration 
    'authenticate' => [ 
     'Form' => [ 
      'fields' => ['username' => ['email','phone']] 
     ] 
    ], 
    'storage' => 'Session' 
]); 

只要傳遞值作爲陣列username

而在你的登錄功能,這樣做:

$username = $this->data['User']['username']; 
$user = $this->User->findByEmail($username); 
if (empty($user)) 
{ 
    $user = $this->User->findByPhone($username); 
} 
+0

謝謝你的回答,我也可以用Magic Method $ this - > {MODEL} - > findByEmailOrPhone('{EMAIL}','{PHONE}')'但實際上我不想這樣做,我想從AuthComponent處理這個任務 –

+0

@ SumonSarker OK,正如我所說的,你可以在authComponent上傳遞值作爲數組,你可以在登錄函數中訪問它,但是你可以訪問它。 – mega6382

+0

謝謝:)(y) –