CakePHP3 自動ログイン(オートログイン)機能のサンプルコードです。
=簡易メモ=
・ユーザーログイン画面にて自動ログインにチェックされていた場合、Cookie(AUTO_LOGIN)セットする。
・上記設定以降、次回アクセス時にCookie(AUTO_LOGIN)存在かつ有効期限内(下記サンプルは1ヶ月)の場合、自動的にログインする。
・ユーザーがログアウトした場合は、今後自動ログインしないよう、Cookie(AUTO_LOGIN)削除する。
◯ ユーザー自動ログイン用のテーブル定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | // ユーザーテーブル // status 0:仮登録 1:本登録 2:退会 CREATE TABLE `users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, `email` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `status` char(1) DEFAULT 0, `created` DATETIME DEFAULT NULL, `modified` DATETIME DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; // ユーザー自動ログイン管理テーブル CREATE TABLE `auto_logins` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY, `user_id` INT(11) NOT NULL, `login_key` VARCHAR(255) NOT NULL, `created` DATETIME DEFAULT NULL, `modified` DATETIME DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; |
◯ 「src/Controller/UsersController.php」に自動ログイン設定・解除実装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | class UsersController extends Controller { public function beforeFilter(Event $event) { parent::beforeFilter($event); // loadModel $this->loadModel('AutoLogins'); } public function login() { // ・・・ // ※ $userにユーザー情報取得済み前提 // 自動ログインチェック時にcookie設定 if ($this->request->data('auto_login_check') === '1') { // ユーザー確認用の乱数生成 $set_key = hash('sha256', (uniqid() . mt_rand(1, 999999999) . '_auto_logins')); // ユーザー自動ログイン管理テーブル レコード登録 $entity = $this->AutoLogins->newEntity(['user_id' => $user['id'], 'login_key' => $set_key]); $this->AutoLogins->save($entity); // Cookieセット $this->Cookie->write('AUTO_LOGIN', $set_key); } // ・・・ } public function logout() { // ・・・ // ※ $userにユーザー情報取得済み前提 // ユーザー自動ログイン管理テーブルからレコード削除 $this->AutoLogins->deleteAll(['user_id' => $user['id']]); // Cookie削除 $this->Cookie->delete('AUTO_LOGIN'); // ・・・ } } |
◯ 「src/Controller/AppController.php」にユーザー自動ログイン処理実装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | class AppController extends Controller { public function initialize() { parent::initialize(); // ・・・ $this->loadComponent('Cookie'); $this->loadComponent('Auth', [ 'authenticate' => [ // ユーザー認証に使用するカラム(email, password) 'Form' => [ 'fields' => [ 'username' => 'email', 'password' => 'password' ] ] // ユーザー認証に使用するカラム(email, password, status[1のみ]) // 'Form' => [ // 'fields' => [ // 'username' => 'email', // 'password' => 'password' // ], // 'scope' => ['status' => 1] // ] ], // ログインを扱うコントローラーとアクション(デフォルト:/users/login) 'loginAction' => [ 'controller' => 'Users', 'action' => 'login' ], // ログイン後のリダイレクト先(コントローラーとアクション) 'loginRedirect' => [ 'controller' => 'Users', 'action' => 'index' ], // ログアウト後のリダイレクト先(コントローラーとアクション) 'logoutRedirect' => [ 'controller' => 'Users', 'action' => 'index' ], // 未ログイン時にログイン必須ページを閲覧した際のMSG 'authError' => __('ログインしてください。') ]); // ・・・ // ユーザー自動ログイン(未ログイン時かつ自動ログインCookie有効な場合) $user = $this->Auth->user(); // ユーザーのログイン情報の取得 $auto_login_key = $this->Cookie->read('AUTO_LOGIN'); // 自動ログインCookie取得 if (empty($user) && !empty($auto_login_key)) { $this->loadModel('AutoLogins'); // Cookieから取得したkey一致かつ有効期限内(1ヶ月) $auto_logins_data = $this->AutoLogins->find() ->where(['login_key' => $auto_login_key, 'created >=' => date('Y-m-d H:i:s', strtotime('-1 month'))]) ->first(); if (isset($auto_logins_data->user_id)) { // ユーザー情報取得 $this->loadModel('Users'); $user = $this->Users->find()->where(['id' => $auto_logins_data->user_id, 'status' => '1'])->first(); if (!empty($user)) { $this->Auth->setUser($user); // ユーザーログイン } } } } } |
◯ ブラウザにセットされたCookie例