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']という名前で保存されます。
- $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); } } }
- $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と綴ってしまう。
関連記事
-
メール送信(qdmail)
CakePHP(+qdmail)でメール送信する処理を実装しました。 準備 2つのライブラリ(.php)をダウンロードし、以下のように配置して下さい。 app/controllers/compo
-
コントローラ内でバリデーション処理を呼び出す
通常、saveメソッドの際にバリデーション処理も自動で行われますが、save処理と切り離してバリデーションを行うこともできます。このときは、save時と若干異なる処理体系になります。 バリデーシ
-
独自のバリデーションルール
CakePHPで組み込みバリデーションをつくる方法は色々あります。 参考:Data Validation — CakePHP Cookbook v1.3 documentation 上記リンク内に
-
フィールド単位でバリデーション無効化
save処理の際に条件付でモデルのバリデーションをフィールド単位でスキップする処理のメモです。(最終的に使うことはなかったのでメモ) 関数は unset( $this->->validate[
-
Jsヘルパーを使用してAjax更新
更新処理でページ遷移を伴う場合、ページ全体をレスポンスするのに対して、Ajax処理ではページの一部のレスポンスが可能となるためサーバからの通信量を抑えることが可能となります。 Jsヘルパーを使用して
-
Sessionコンポーネント
ソース: /cake/libs/controller/components/session.php read read($name = null) セッションの情報を読み込みます。 $
-
複数データベースの追加と切替
CakePHPで複数のデータベースに切替を行うということがあると思います。(個人的にはあまりない) 今回、CakePHPからWordpressのデータベースへの接続を行う機会があったので設定を試して
-
Secutiryユーティリティ
CakePHPでは、データのハッシュ化もしくは暗号化のためのメソッドSecurityユーティリティが用意されています。 ソース: /cake/libs/security.php Security:
-
Htmlヘルパー
ソース:\cake\libs\view\helpers\html.php charset / 文書の文字コードを設定する <?php echo $this->Html-
-
ユーザ登録(仮登録・メール・本登録)
ここ最近は、メールアドレスだけでなく、SNSのアカウントと連携してユーザ登録することもできるWebサービスが増えてきましたね。ユーザは割合としてどちらを選んでるのか気になるところですが。私はできるだけ
- PREV
- 投稿タイトル(entry-title)を非表示にする
- NEXT
- vs SQLite コマンド対応表