説明
cakePHPで自動ログインをする機能を汎用化出来ないかと思い、
コンポーネントにしてみました。
・動作概要
1.セッションIDだけをcookieに保持し、他の情報は保持させない。
2.他のブラウザ/場所でログインしても、それぞれに有効期限付きのcookieが発行される。
3.どこでログアウトしても全てのセッションをログアウト状態にする。
・使用方法
使用する前に、ユーザのセッションIDとユーザIDを保持するテーブルを追加します。
作成したセッションID保存用テーブル
CREATE
TABLE `session_datasets` (
`id` int(10) unsigned NOT NULL auto_increment,
`user_id` int(10) unsigned NOT NULL,
`session_id` char(40) NOT NULL,
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
PRIMARY KEY (`id`),
UNIQUE (`session_id`),
INDEX (`user_id`),
FOREIGN KEY (`user_id`) REFERENCES user_profile (`id`) ON DELETE CASCADE
)ENGINE=InnoDB DEFAULT CHARSET=utf8
ユーザ情報とセッションIDを分けることで、ユーザ情報がどのような形でも同じように処理することが出来ます。
また、DBへのアクセスはcakePHPに任せるので、上記で作ったテーブルのモデルが必要になります。
上記テーブルのモデル
<?php
classSessionDataset extends AppModel {
var $name = 'SessionDataset';
var $validate = array(
'user_id' => VALID_NOT_EMPTY,
'session_id' => VALID_NOT_EMPTY,
);
var $belongsTo = array(
'UserProfile' =>
array('className' => 'UserProfile',
'foreignKey' => 'user_id',
'conditions' => '',
'fields' => '',
'order' => '',
'counterCache' => ''
),
);
}
?>
startup()メソッドの中で使用するモデルの設定をします。
設定するのは6点。
・ユーザ情報を扱うモデル名(ココではUserProfile)
・ユーザ情報の中でユニークな主キーを保存する列名(ココではemail)
・ユーザ情報の中でパスワードの列名(ココではpassword)
・セッション情報を扱うモデル名(上記で作ったモデル名SessionDataset)
・セッション情報の中でユーザIDを保存する列名(ココではuser_id)
・セッション情報の中でセッションIDを保存する列名(ココではsession_id)
これらの設定をしたauth.phpを/app/controllers/compornents以下に配置後、ログイン処理が必要なコントローラに
var $components = array('Auth');
を追加します。
大抵の場合、ログインが必要なサービスは全ての画面でログイン判定を使うことになるので、AppControllerに追加し、beforeFilter()メソッド内に
function beforeFilter() {
parent::beforeFilter();
$this->set('isLogin' , $this->Auth->isLogin());
}
とすると良いかも知れません。
・各メソッド詳細
boolean
login($key, $password, $expire = null)
$keyはユーザ情報テーブルからユーザIDを取得するためのユニークなキー値です(例えばメールアドレスなど)
$passwordはフォームから入力されたパスワードです。
中でハッシュ化はしていませんので、必要な場合はこのメソッドに渡す前にハッシュ化して下さい。
$expireはcookieの有効期限です。この秒数の間、ブラウザを閉じてもcookieがあればisLogin()はtrueを返します。
boolean
logout()
セッションID保存用テーブルからログアウトするユーザIDのレコード全てを消去し、cookieを無効にします。
boolean
isLogin()
有効期限内のcookieにsession_idがあり、セッションID保存テーブル内に同じIDが有ればtrueを返します。
コメント

- 2:haseken
- 2007/09/19 10:37
この長い内容詳しく見ていただいた様でありがとうございます^^;
>それ、logoutじゃないから!
×ログアウトしても
○ブラウザを閉じても
ですね^^;
>login()メソッド
> 引数のデフォルト値、$expire
>logout()メソッド
>
確かにその通りですね。
修正しておきます。
指摘ありがとうございました。
前へ 1 次へ![]()
コメントする
[block]から[/block]までの範囲はブロック表示されます。
部分的に目立たせたい時や、引用などにお使いください。
[code]から[/code]までの範囲は等幅表示されます。
ソースコードや設定ファイルの記述などにお使いください。














> $expireはcookieの有効期限です。この秒数の間、ログアウトしてもcookieがあればisLogin()はtrueを返します。
= null じゃなくて、普通 $expire = 0 じゃね?
getUserID()を呼ばずに、コードをコピペしてるのはダサくね?
それ、logoutじゃないから!
login()メソッド
引数のデフォルト値、$expire
logout()メソッド