CakePHP3でログインフォームの認証用に Users 以外のテーブルを利用する
Users
以外のテーブルをログインフォームでの認証に使用したい場合、authenticate
を使用します。
src\Controller\AppController.php
に以下を追加します。Form
に'userModel' => 'テーブル名'
でログインフォーム用のテーブルを指定します。
public function beforeFilter(Event $event)
{
$this->Auth->config('authenticate', [
'Form' => ['userModel' => 'Cakeusers'],
]);
}
認証用テーブルの定義作成
認証用に使うテーブルとエンティティの定義を作成します。
今回はCakeusers
というテーブルを認証用に用意したサンプルです。
Table の作成
\src\Model\Table\CakeusersTable.php
を作成します。
<?php
namespace App\Model\Table;
use Cake\ORM\Table;
use Cake\Validation\Validator;
class CakeusersTable extends Table
{
public function validationDefault(Validator $validator)
{
return $validator
->notEmpty('username', 'このフィールドに入力してください。')
->add('password', [
'length' => [
'rule' => ['minLength', 8],
'message' => 'パスワードは 8 文字以上必要です。'
]
]);
}
}
Entity の作成
src\Model\Entity\Cakeuser.php
を作成します。
<?php
namespace App\Model\Entity;
use Cake\Auth\DefaultPasswordHasher;
use Cake\ORM\Entity;
class Cakeuser extends Entity
{
// 主キーフィールド "id" を除く、すべてのフィールドを一括代入可能にします。
protected $_accessible = [
'*' => true,
'id' => false
];
protected function _setPassword($password)
{
return (new DefaultPasswordHasher)->hash($password);
}
}
コントローラーを変更しない場合
UsersController.php
で認証コントローラーを使いたい場合は、以下のようにしてテーブルを差し替えると便利です。
public function initialize()
{
parent::initialize();
$this->Users = TableRegistry::get('Cakeusers');
}