ブラウザを閉じた後でも自動的にログインできるようにログイン・フォームに「次回から自動的にログイン」「次回からログインを省略」「Remember me」などのチェックボックスが備わっているケースを良く見かけます。AuthComponentとCookieComponentを使って実装してみます。AuthComponentのページで説明した例の続きとして説明いたします。


その1では、Authenticationにある方法を紹介します。

自動ログイン機能とは

自動ログイン機能とは、ログインが必要なページにもユーザー名やパスワードの入力なしでアクセスできる便利な機能です。ログイン時に「次回から自動的にログイン」にチェックしてログインすると自動ログインが有効になります。クッキーが使えるブラウザのみ対応。

自動ログインの仕組み

「次回から自動的にログイン」にチェックしてログインしたユーザーのブラウザのクッキーにユーザーを特定できるキーを持たせます。ログインしていないユーザーがクッキーにキーを持っている場合、そのキーを使ってログインを試みます。実際のページ遷移は次のようになります。

  1. ログインが必要なページAにアクセス
  2. ログイン用ページへリダイレクト
  3. 自動ログイン実行
  4. ログイン直前のページ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());//ログアウトし、ログイン画面へリダイレクト
    }
}

CakePHP Note (v1.3)

Index