Cookieログイン

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

Cookieコンポーネントの使用

var $components = array(
  'Cookie',
}

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

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

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

function login(){
  // keep_me_logged_inチェックボックスがcheckされている場合
  if (!empty($this->data) && $this->data['User']['keep_me_logged_in']) {
    $cookie = array();
    // username
    $cookie['username'] = $this->data['User']['username'];
    // password
    $cookie['password'] = $this->data['User']['password'];
    // cookie書き込み
    $this->Cookie->write('Auth.User', $cookie, true, '+2 weeks');
    unset($this->data['User']['keep_me_logged_in']);
  }
}

これで、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週間。

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

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

function login(){
  if (empty($this->data)) {
    $cookie = $this->Cookie->read('Auth.User');  // クッキーをリード
    if (!is_null($cookie)) {
      if ($this->Auth->login($cookie)) {
        // cookieの内容でログイン成功
        $this->Session->delete('Message.auth');
        $this->redirect($this->Auth->redirect());
      } else {
        // cookieの内容でログイン失敗
        $this->Cookie->delete('Auth.User');  //  クッキー削除
      }
      $this->log("-I- LOGIN with COOKIE", LOG_DEBUG);
    }
  }
}
read(mixed $key)

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

deleteメソッド (削除する)

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

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()メソッド個別で設定可能

現在の設定は、$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!';
}

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

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

関連記事

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

CakePHPで複数ファイルのアップロードについて調べてみました。といっても普通のPHPのコードと同じではありますが、postするフィールド名に[]を付与して配列にします。 view

no image

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

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

no image

validateErrors と validationErrors

CakePHP試験中に気付いたことがあって、メモです。 $this->validateErrors自身バリデーション処理している 今まで、save時にバリデーションエラーメッセージををログに出力し

no image

recursive設定によるfind()性能改善

CakePHPでは、モデルにアソシエーションを設定している場合、recursive(=>joinする階層)はデフォルトで0に設定されています。「recursiveゼロ」の意味するところとは、「1跨ぎま

no image

Debugkitをインストール

CakePHPのデバッグツールとしてはデファクトスタンダードといってもいいDebugkitをインストールしました。 ダウンロード CakePHP 1.3用 https://github.com

CakePHP 1.3 インストール

使い古されている手ではありますが、表題の件とレンタルサーバへの配置方法などにも使えますので参考にしていただけたらと思います。 まずはレンタルサーバでCakePHPを動作させる CakePHPア

no image

独自のバリデーションルール

CakePHPで組み込みバリデーションをつくる方法は色々あります。 参考:Data Validation — CakePHP Cookbook v1.3 documentation 上記リンク内に

no image

ビルトインされたバリデーションルール

CakePHP標準で多くのバリデーションルールが搭載されています。 ソース:/cake/libs/validation.php email / maxLength / minLength /

コントローラ内でバリデーション処理を呼び出す

通常、saveメソッドの際にバリデーション処理も自動で行われますが、save処理と切り離してバリデーションを行うこともできます。このときは、save時と若干異なる処理体系になります。 バリデーシ

no image

シンプルに設置できる数字Captcha「MathCaptcha」

スパム防止などで利用されているCaptchaですが、数字版で使えるものがないか探してみました。 この「MathCapthca」は非常にシンプルに設置できるのはいいですが、やっぱりクエスチョンの部分は

Message

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

*

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

    PAGE TOP ↑