自動ログイン1
ブラウザを閉じた後でも自動的にログインできるようにログイン・フォームに「次回から自動的にログイン」「次回からログインを省略」「Remember me」などのチェックボックスが備わっているケースを良く見かけます。AuthComponentとCookieComponentを使って実装してみます。AuthComponentのページで説明した例の続きとして説明いたします。
その1では、Authenticationにある方法を紹介します。
自動ログイン機能とは
自動ログイン機能とは、ログインが必要なページにもユーザー名やパスワードの入力なしでアクセスできる便利な機能です。ログイン時に「次回から自動的にログイン」にチェックしてログインすると自動ログインが有効になります。クッキーが使えるブラウザのみ対応。
自動ログインの仕組み
「次回から自動的にログイン」にチェックしてログインしたユーザーのブラウザのクッキーにユーザーを特定できるキーを持たせます。ログインしていないユーザーがクッキーにキーを持っている場合、そのキーを使ってログインを試みます。実際のページ遷移は次のようになります。
- ログインが必要なページAにアクセス
- ログイン用ページへリダイレクト
- 自動ログイン実行
- ログイン直前のページAにリダイレクト
実装
クッキーの操作はCookieComponentを使うと便利です。今回はユーザー名とパスワードをクッキーに設定します。パスワードはAuthComponentによってハッシュ化され、クッキーはCookieComponentによって暗号化します。(暗号化されているとはいえユーザー名とパスワードをクッキーに持たせたくない場合の方法をその2で紹介します)
ビューにチェックボックスを用意します。app/views/users/login.ctp
echo $form->create('User', array( 'action' => 'login')); echo $form->input('username'); echo $form->input('password'); echo $form->checkbox('remember_me')."次回から自動的にログイン"; echo $form->end('Login');
コントローラーを修正します。app/controller/users_controller.php
class UsersController extends AppController { var $components = array('Auth','Cookie');//Cookieコンポーネントを追加 function beforeFilter() { $this->Auth->autoRedirect = false;//自動リダイレクトをオフ } function login() { if (empty($this->data)) { $cookie = $this->Cookie->read('Auth.User'); if (!is_null($cookie)) { //クッキーの情報でログインしてみる。 if ($this->Auth->login($cookie)) { $this->redirect($this->Auth->redirect()); } } } if ($this->Auth->user()) { if (!empty($this->data['User']['remember_me'])) { $cookie = array(); $cookie['username'] = $this->data['User']['username']; $cookie['password'] = $this->data['User']['password'];//ハッシュ化されている $this->Cookie->write('Auth.User', $cookie, true, '+2 weeks');//3つめの'true'で暗号化 unset($this->data['User']['remember_me']); } $this->redirect($this->Auth->redirect()); } } function logout() { $this->Cookie->del('Auth.User'); $this->redirect($this->Auth->logout());//ログアウトし、ログイン画面へリダイレクト } }