2017-10-12 44 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) –