2017-01-30 19 views
0

私はCakePHP 3.3で作業しています。 メールまたはモバイル番号パスワードのいずれかを使用してログインするようにしてください。カスタムファインダーがCakePHP 3で動作していません

私はユーザテーブルにemail, mobile, password, etcフィールドを持っています。

CakePHP docによれば、カスタムファインダーauthを使用してログインしています。

AuthUsersController.php

UsersTable.php

public function findAuth(Query $query, array $options) 
{ 
    $query 
     ->select(['id', 'email', 'mobile', 'password']) 
     ->where(['Users.email' => $options['login']]) 
     ->orWhere(['Users.mobile' => $options['login']]); 

    return $query; 
} 

とログイン()アクションでAppController.php

$this->loadComponent('Auth', [ 
     'loginRedirect' => [ 
      'controller' => 'Dashboard', 
      'action' => 'index' 
     ], 
     'logoutRedirect' => [ 
      'controller' => 'Pages', 
      'action' => 'home' 
     ], 
     'authenticate' => [ 
      'Form' => [ 
       'finder' => 'auth' 
      ] 
     ] 
    ]); 

findAuth()アクションコンポーネント

public function login() { if ($this->request->is('post')) { $user = $this->Auth->identify(); if ($user) { $this->Auth->setUser($user); return $this->redirect($this->Auth->redirectUrl()); } $this->Flash->registerError(__('Invalid Credentials, try again'), ['key' => 'registration']); } } 

login.ctpビューは

<?php 
    echo $this->Form->create(); 
    echo $this->Form->input('login'); 
    echo $this->Form->input('password'); 
    echo $this->Form->submit(); 
    echo $this->Form->end(); 
?> 

が含まれています。しかし、これはInvalid Credentials, try again

Update 2

を作業して印刷されていないusers表に空欄usernameを追加しました。

login.ctp

<?php 
    echo $this->Form->create(); 
    echo $this->Form->input('username'); 
    echo $this->Form->input('password'); 
    echo $this->Form->submit(); 
    echo $this->Form->end(); 
?> 

AppController.php:AuthComponentの

同上

findAuth()

public function findAuth(Query $query, array $options) 
{ 
    $query 
     ->orWhere(['Users.email' => $options['username']]) 
     ->orWhere(['Users.mobile' => $options['username']]); 

    return $query; 
} 

これで動作します。しかし、アプリケーションで不要な場合でも、なぜusername列を使用するように強制しますか?

+0

はいくつかのバージョンとドキュメントのためにサポートしていませんが、このために非常に十分ではありません。 –

答えて

0

docで説明されているように、ユーザーの認証に必要なすべてのフィールドを選択する必要があります。

public function findAuth(Query $query, array $options) 
{ 
    $query 
     ->select(['id', 'email', 'mobile', 'username', 'password']) 
     ->orWhere(['Users.email' => $options['login']]) 
     ->orWhere(['Users.mobile' => $options['login']]); 

    return $query; 
} 

$options['login']があなたのフォームにあることを確認してください。

更新: あなたが使用してみてくださいフォーム入力として 'ログイン' を使用している場合:

 'authenticate' => [ 
      'Form' => [ 
       'finder' => 'auth', 
       'fields' => ['username' => 'login', 'password' => 'password'] 
      ] 
     ] 

fields The fields to use to identify a user by. You can use keys username and password to specify your username and password fields respectively.

私自身のクエリを(fields => [username => login]せずに)私のアプリを使用して:

SELECT 
    Users.id AS `Users__id`, 
    Users.username AS `Users__username`, 
    Users.password AS `Users__password`, 
    Users.role AS `Users__role`, 
    Users.email AS `Users__email` 
FROM 
    users Users 
WHERE 
    (
    Users.email = '[email protected]' 
    OR (
     Users.username = '[email protected]' 
     AND Users.username = '[email protected]' 
    ) 
) 

私のログインは似ていますが、フィールドの代わりにユーザー名と電子メールを使用しています。

更新2: ドキュメントはそれほど大きくありません。だから私は、デフォルトでカスタムファインダを使ってクエリを作成すると、最初にWHERE this = 'something'を追加してCakeが修正し、解決策がorWhereを他のすべてのもの(findAuthが変更されたもの)で使用されていると考えました。

新規クエリー:私は、CakePHP too..maybeここで働いていた別のアプローチではなくでテスト

SELECT 
    Users.id AS `Users__id`, 
    Users.username AS `Users__username`, 
    Users.password AS `Users__password`, 
    Users.role AS `Users__role`, 
    Users.email AS `Users__email` 
FROM 
    users Users 
WHERE 
    (
    Users.email = 'user' 
    OR Users.username = 'user' 
) 
+0

も ​​'select 'で試してみましたが、幸運なことはありません...選択で – Gaurav

+0

質問しました。私は正確にそれをアプリで実行しました。あなたのフォームフィールドは[login] 。 –

+0

「ファインダー」と「フィールド」の両方を認証内で使用する方法を知りましたか?それはトリックと+1ですが、これはうまくいきます。 –

関連する問題