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']という名前で保存されます。
- $key:Cookieの変数名です。(ドット表記できます。)
- $value:保存する値を入れます。今回は、usernameとpassword
- $encrypt:暗号化有無。暗号化せず平文で保持する場合は、falseへ。暗号化は、Security.saltとSecurity.cipherSeedを使用して行われます。
- $expires:クッキーの有効期限を設定します。秒数もしくは、strtotime()で変換可能な文字列で指定します。上の例だと2週間。
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');
今回は、クッキーデータの扱い方法をログインに例にとって投稿してみました。
関連記事
-
-
FullCalendarを使用してカレンダーアプリケーション
カレンダーアプリケーションを作成するため、カレンダー表示できるプラグインを探索して出会ったFullcalendarを試してみました。シンプルに使用できる上に、オプションがかなり豊富です。ダウンロード
-
-
FormヘルパーのMagicOption (マジックオプション)
Formヘルパーでは、「フィールド名」,「テーブルカラムのデータ型」もしくはモデルの「バリデーション設定」によりフォーム要素を決定したり、自動で属性を付与する「マジックオプション」と呼ばれるものがある
-
-
アップロードファイルのバリデーションルール
CakePHP 2.2や2.3になってファイルアップロードに対するルールがコアバリデーションに追加されているようで、まとめてみました。 コアバリデーション 関連しそうなルールは以下の4つの
-
-
テーブルからランダムにデータを取り出す(find)
CakePHPでテーブルから特定件数のレコードをランダムに取得するには以下のように指定するとできます。 $this->data = $this->Bulkdata->find( 'all',
-
-
ログローテーション
CakePHP 2.xではbootstrap.php内にあらかじめアプリケーションログの設定が書かれています。2.xで日付ごとにログファイルが切り替わるよう設定してみました。 日ごとにログを切り替え
-
-
Markdown Plugin
「Markdown CakePHP Plugin」は、MarkDown書式をレンダリングしてくれるビューヘルパーです。MarkDownについて勉強しているうちに出会ったので試し打ちです。 ダウンロー
-
-
Js/Cssファイルの読み込みや出力する方法
CakePHPのHTMLヘルパーにはjsファイルやcssファイルを読み込むためのメソッドが用意されています。ファイルを読み込むのに加えて、出力先を複数指定できるようになっています。 また、インライン
-
-
Jsヘルパーを使用してAjax更新
更新処理でページ遷移を伴う場合、ページ全体をレスポンスするのに対して、Ajax処理ではページの一部のレスポンスが可能となるためサーバからの通信量を抑えることが可能となります。デモ head
-
-
数値系バリデーション
CakePHP 2になっていくつか数値用バリデーションルールが追加されています。 数値用 (コア)バリデーション decimal - 十進数であること numeric - 数値であること
-
-
ユーザ登録(仮登録・メール・本登録)
以前1.3版で投稿した「ユーザ登録」処理の2.x版を作成しました。フローは同じで以下のようにします。 1. メールアドレス・パスワードでユーザ登録 2. この時点では仮登録として、本登録用のU
- PREV
- Google+ プラスワン(+1)ボタンの設置
- NEXT
- 複数データベースの追加と切替



Comment
ログインが成功したユーザーidとパスワードをCookieに保存する、
という形のサンプルになってますが、
これだとセキュリティ上どうなんでしょう
わかりやすいですね
@Momo060849 http://t.co/krFCYokXzg
CakePHP 2.x - Cookieログイン http://t.co/SaotazXb6U