2017-10-12 9 views
5

複数のフィールドチェックを使用してログインしたい。CakePHP 3 - 複数フィールド認証ログイン

現状:ここで使用(Email)およびログイン

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

用(Password)フィールドは、私のAuthコンポーネントの設定です:

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

私の期待:Emailを使用してまたはPhone)および(Password)私はこのような状況を満たすためにAuthコンポーネントを設定するにはどうすればよいのログイン

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

のためのフィールドは?

+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オプションでは常にがファインダに渡されることに注意してください。

また、オーセンティケータによって生成された可能な既存の条件を削除するか、この例のように上書きして、第3引数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

はご回答いただきありがとうございます。私も 'のようなマジックメソッドを使用してそれを行うことができます$この - > {MODEL} - 。> findByEmailOrPhone( '{EMAIL}'、 '{PHONE}を') 'しかし、実際に私はこのようように行うにはしたくない私は、このタスクは' AuthComponent'から扱いたい –

+0

@。。 SumhSarker OK、私はあなたがauthComponent上の配列として値を渡すことができると言ったので、あなたはログイン機能でそれを望むかもしれませんが、アクセスすることができます。 – mega6382

+0

ありがとう:)(y) –

関連する問題