Cookieログイン

今回は、ログイン画面でよくみかけるクッキーログインの機能を使ってみます。

CakePHPには、Cookieコンポーネントがあります。(PHPのsetcookieメソッドのラッパー)メソッドはwriteとreadです。わかりやすい。
ログイン時に、「ログインしたまま」というチェックボックスをつけてログインしてきたユーザのクッキーをwriteして、次回そのユーザが訪問した際に、クッキーをreadして自動的にログインさせます。

Cookieコンポーネントの使用

var $components = array(
    'Cookie',
}

使用する際は、コントローラ内でコンポーネントを読み込んで下さい。

writeメソッド (クッキーをつくる)

ログイン画面にチェックボックスを用意します。今回は、remember_meにします。以下は、Userモデルのusernameとpasswordという前提にしていますので、異なる場合は置き換えて下さい。

public function login() {
    if (!empty($this->data) ) {
        // ログイン OK
        if ($this->Auth->login()) {
            // remember_meがチェックされている場合
            if ($this->data['User']['remember_me']){
                // cookieへの書き込みにremember_meを除外
                unset( $this->request->data['User']['remember_me']);
                $cookie = $this->request->data;
                // cookie書き込み
                $this->Cookie->write( 'Auth', $cookie, true, '+2 weeks');

            // remember_meがチェックされていない場合
            } else {
            }
            // リダイレクト
            return $this->redirect( $this->Auth->redirect());

        // ログイン NG
        } else {
            $this->Session->setFlash( 'Invalid username or password');
        }
    }
}

これで、CakeCookie['Auth']['User']という名前で保存されます。

write(mixed $key, mixed $value, boolean $encrypt, mixed $expires)

  • $key:Cookieの変数名です。(ドット表記できます。)
  • $value:保存する値を入れます。今回は、usernameとpassword
  • $encrypt:暗号化有無。暗号化せず平文で保持する場合は、falseへ。暗号化は、Security.saltとSecurity.cipherSeedを使用して行われます。
  • $expires:クッキーの有効期限を設定します。秒数もしくは、strtotime()で変換可能な文字列で指定します。上の例だと2週間。
有効期限を無期限とする設定は特別には用意されていないようです。個人的には2038年問題にどこかでぶつからないように'+20 years'などとしています。(2030年代前半くらいまで) 基本的には今のブラウザでは取り扱いには問題ないようですが、用心のためそうしています。

readメソッド (クッキーをつかう)

ログイン画面にアクセスした際に、$keyをもとにクッキーのデータをリードして、その値でログインを試みます。

function login(){
    if (empty($this->data) ) {
        // cookie 有り
        if ($this->Cookie->check('Auth')) {
            // cookieをログイン用データに書き込み
            $this->request->data = $this->Cookie->read('Auth');
            // ログイン OK
            if ($this->Auth->login()) {
                // ログインリダイレクト
                return $this->redirect( $this->Auth->redirect());
            // ログイン NG
            } else {
                // coockie削除
                $this->Cookie->delete('Auth');    //    クッキー削除
            }
        // cookie 無し
        } else {
            // ログイン画面表示
        }
    }
}

$this->Cookie->read('Auth')の中身を確認すると、以下のようになっており、ログイン処理に使用するUserデータそのものになっているはずです。

Array
(
    [User] => Array
        (
            [username] => ユーザ名
            [password] => パスワード
        )
)
    read(mixed $key)

  • $key - Cookieの変数名です。(ドット表記できます。)

deleteメソッド (削除する)

Cookieの中身を削除します。Cookieの内容でログインできない場合は、deleteしてください。そうしないと堂々巡りになります。(上記) また、ログアウト時もdeleteして下さい。

public function logout() {
    $this->Cookie->delete('Auth');
    return $this->redirect( $this->Auth->logout());
}

destroyメソッド

Cookieそのものを破棄します。違いは、deleteはcookieの値を指定して削除できるのに対し、destroyはごっそり消します。

Cookieコンポーネントの変数

変数 デフォルト値 説明
string $name "CakeCookie" クッキーデータの「name」
string $key 'Security.salt'の値 クッキーの値を暗号化に使用される文字列。ランダムで複雑な値にする必要がある。
string $domain "" クッキーへのアクセスを許可するドメイン。".yourdomain.com" とした場合は、そのサブドメイン全てで許可されます。
int or string $time "5 Days" クッキーの有効期限。数値は秒として扱われる。0とすると"セッションCookie"として扱われます。(←ブラウザを閉じると破棄される。)文字列の場合は、PHPのstrtotime()を使用して解釈されます。この値は write()メソッド内でも設定可能
string $path "/" クッキーが適用されるパス。‘/foo/’と設定した場合は、/foo/ディレクトリとそのサブディレクトリのみで利用できる。デフォルトは、全ディレクトリになる。write()メソッド個別で設定可能
boolean $secure FALSE クッキーの送信をHTTPSのみに限定するか否か。trueで設定。これもwrite()メソッド個別で設定可能
boolean $httpOnly FALSE trueでクッキーへのアクセスをHTTPのみにして、Javascript経由でアクセスさせない。

現在の設定は、$this->log($this->Cookie, LOG_DEBUG)などで確認してみて下さい。

function beforeFilter() {
    $this->Cookie->name = 'baker_id';              // クッキー名‘baker_id’
    $this->Cookie->time = 3600;                    // 有効期間=>1時間
    $this->Cookie->path = '/bakers/preferences/';  // /bakers/preferences/
    $this->Cookie->domain = 'example.com';         // example.comドメイン
    $this->Cookie->secure = true;                  // HTTPSの場合のみ送信
    $this->Cookie->key = 'qSI232qs*&sXOw!';
}

Session用のCookieのキー名を変更する

Session用のクッキーを格納するキー名はデフォルトでは、"CAKEPHP"になっています。必須ではないですが、変更してみます。core.phpに

/* - `Session.cookie` - The name of the cookie to use. Defaults to 'CAKEPHP' */
    Configure::write( 'Session.cookie', 'NAMEOFKEY');



今回は、クッキーデータの扱い方法をログインに例にとって投稿してみました。

  • このエントリーをはてなブックマークに追加

関連記事

バリデーションエラーメッセージの取得

CakePHP 2.xになってバリデーションエラー時に返却されるメッセージのデータ形式が変更になったようです。1.3系では、ひとつのフィールドに対して返却されるメッセージは一つのルールのみですが、2.

ハッシュ関数の選択とハッシュ化処理

CakePHPでは、ログイン時にはpasswordを自動的にハッシュ化して認証を行ってくれますが、そのパスワードを登録する際は、明示的にハッシュ化する必要があります。 ハッシュ関数の選択 ハッ

Markdown Plugin

「Markdown CakePHP Plugin」は、MarkDown書式をレンダリングしてくれるビューヘルパーです。MarkDownについて勉強しているうちに出会ったので試し打ちです。 ダウンロー

ログローテーション

CakePHP 2.xではbootstrap.php内にあらかじめアプリケーションログの設定が書かれています。2.xで日付ごとにログファイルが切り替わるよう設定してみました。 日ごとにログを切り替え

Jsヘルパーを使用してAjax更新

更新処理でページ遷移を伴う場合、ページ全体をレスポンスするのに対して、Ajax処理ではページの一部のレスポンスが可能となるためサーバからの通信量を抑えることが可能となります。デモ head

入力文字列の長さ(文字数)をバリデーション

CakePHP 2には、コアバリデーションに文字列の長さを検証する関数が用意されています。 文字列長(コア)バリデーション minLength - 最小文字数以上であること maxLengt

複数ファイルアップロードフォーム

CakePHP 2.0からはHTML5が標準でサポートとなり、複数ファイルアップロードのためのフォーム記述が容易になりました。 View (ビュー) 配列 Array (

Formヘルパーのinputタグのdiv/labelなどの設定

Formヘルパーのinputではデフォルトでは以下のようにdivで囲われて、labelが付与されて出力されます。 CSSのフレームワークなどであらかじめ決まったスタイルがある場合に便利に作られていま

no image

radioボタンを実装

Radioボタンの実装は、セレクトボックスとほぼ同じです。 個人的にはラジオボタンをすすんで使用することは少ないのですが、2択くらいの選択肢であれば非常に便利ですよね。 今回は、その実装方法 デモ

SQLクエリーをログに出力する

SQLのクエリーをデバッグするには、Debug Kitを使用すればできますが、デバッグログと一緒に出したいのでやり方を調査してみました。 別々のログやビューでみるのもいいですが、秒単位で実行される処

Comment

  1. ログインが成功したユーザーidとパスワードをCookieに保存する、
    という形のサンプルになってますが、
    これだとセキュリティ上どうなんでしょう

CakePHP関連feedとはてブ (@CakePHP_HBFeed) へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

    PAGE TOP ↑