CakePHPにはユーザを認証するための方法がいくつか存在します。よく使われるのが、ログインフォームにIDとパスワードを入力してPOST送信をして認証を行う「FormAuthenticate」という方法かと思います。
今回は、AuthComponentでデフォルトで使用される「FormAuthenticate」で認証するログイン画面の実装方法を紹介していきたいと思います。
公式ドキュメントを見ると色々書いてあり、迷走しそうになるので、必要最低限のコードで説明することにします。
Usersテーブルの準備
まずはusesテーブルを作成します。
CREATE TABLE `users` (
`id` int(11) NOT NULL,
`username` varchar(50) NOT NULL,
`password` varchar(255) NOT NULL,
`full_name` varchar(50) NOT NULL,
`pen_name` varchar(50) NOT NULL,
`gender` int(11) NOT NULL COMMENT '0:男,1:女',
`birthday` date NOT NULL,
`created` datetime NOT NULL,
`modified` datetime DEFAULT NULL,
`delete_flg` int(11) NOT NULL DEFAULT '0' COMMENT '0:在籍,1:退会'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=COMPACT;
とりあえず「username」と「password」のカラムがあればいいので、あとは自由に作成してください。
Authコンポーネントの読み込み
次にAppController.phpの「initialize()」でAuthコンポーネントを呼び出し、以下の設定をします。
【AppController.php】
public function initialize()
{
parent::initialize();
$this->loadComponent('Auth', [
'authenticate' => [ //送信されたフォームデータのキーとログイン処理の「username」「password」を紐つける設定
'Form' => [
'userModel' => 'Users',
'fields' => ['username' => 'username','password' => 'password']
]
],
'loginAction' => [ //ログイン処理を実行する場所設定
'controller' => 'Users',
'action' => 'login'
],
'loginRedirect' => [ //ログイン後のリダイレクト先設定
'controller' => 'Top',
'action' => 'index'
],
'logoutRedirect' => [ //ログアウト後のリダイレクト先設定
'controller' => 'Top',
'action' => 'index'
]
]);
}
ちなみに、「Users」テーブルに「username」と「password」を用意しておけば、「authenticate」の「Form」の設定をしなくてもそこを見に行ってくれるようなので、書かなくてもOKだったのですが、今回は説明のため一応記述しました。
ログイン機能を実装するコントローラーの作成
UsersControllerにloginのアクションを作成します。
【UsersController.php】
public function login()
{
if (isset($this->request->data['login'])) {
$user = $this->Auth->identify(); //←①
if ($user) {
$this->Auth->setUser($user); //←②
return $this->redirect($this->Auth->redirectUrl()); //←③
} else {
//エラー時の処理
}
}
}
簡単に処理の流れを説明します。
①の「identify()」にて、POSTで送信されたデータの「username」と「password」が「Users」テーブルに存在すれば、そのユーザのデータを「$user」にセットします。いなければ何もセットされません。
②で、Authのセッションにユーザのデータを保存することで、ログイン処理を行なっています。
③で、AppController.phpでAuthコンポーネントを呼び出す時に設定した「logoutRedirect」先にリダイレクトするようになります。
viewの作成
ログイン処理をするコントローラーのアクションに対してPOST送信するためのviewを作成します。
【Template/Users/login.ctp】
<form method="post" name="login">
<label>username</label>
<input type="text" name="username">
<label>password</label>
<input type="text" name="password">
<button type="submit" name="login">login</button>
</form>
入力して送信するだけの最低限のコードです。
ここまでの準備ができれば基本的なログイン処理の実装が完了します。
その他、ログイン時の細かい設定やログアウト処理などはこちらを参考にしてください。
まとめ
ざっくり説明すると、
- 「$this->Auth->identify()」でPOST送信されたデータからユーザを識別する。
- 「$this->Auth->setUser()」でユーザ情報をセッションに保持し、ログイン状態を保持する。
ということを基本的にやっています。
あとは、リダイレクト先の設定や、認証に使用するフィールド名の変更等、設定次第で色々できるようになります。
飲食業界からIT業界に転身してきて現在2年目です。PHPの経験がメインとなります。これまで自分がPHPを扱ってきた上で、モヤモヤしてきたことをメインに記事にしていきますのでよろしくお願いいたします。