この記事を三行にまとめると
userFieldsってやつで必要なカラムを指定するだけバージョン2.3辺りではまだ、この仕様が存在しません
みんな熱中症とか夏バテとか大丈夫ですか?
CakePHPのAuthコンポーネントを使っているっていう前提での話になりますが、よしなに。
AppControllerとかで、以下のような記述をすれば良い。
これはフォームを使ってログイン処理を実装する場合の一例です。userFieldsってやつで必要なカラムを指定するだけです。お手軽ですね。
でもこれは、CakePHPのバージョンが比較的新しいものじゃないと、設定ができません。僕が知る限りでは、バージョン2.6だったらこの設定が使えるっぽい。
なので、もし上記の設定が使えないバージョンでIDだけ取って来るようにしたければ、ちょっと自分で改造しないといけない。Componentフォルダの中のAuthフォルダの中にBaseAuthenticate.phpってファイルがあるんですが、その中に「_findUser()」というメソッドがあるんで、その中身をちょちょっといじります。
こんな風に書いちゃえば、IDだけ取って来るようになります。
オーケー、任せろ。
BaseAuthenticate.phpには、$settingsっていうメンバ変数があって、コントローラーからそこに値を渡すことができます。なので、$settingsの中の値を使ってカラムを指定できるようにしとけばオッケーです。
$settingsに渡せば、userFieldsに限らず、いろんな値をAuth側で使えるようになります。
今年の夏は本当に超暑いっすよね〜。みなさん熱中症とか夏バテとか大丈夫ですか?
夏バテ対策にはウナギが良いなんて話も聞きますが、実際のところ、そこまで有効な食べ物ではないようです。それなら夏野菜とか食べた方が良いみたいです。
あくまでも個人的な意見ですが、Authコンポーネントからセッションに渡すデータは、IDだけで良いような気がするんですよね。もちろんサイトの仕様によりますけど。
ただ、僕の経験上、たいていのログイン処理があるサイトは、サイト上でユーザーデータを更新するベージがある。だからセッションにユーザーデータを全部入れて、必要に応じてそこから参照するようにしていると、ユーザーデータが更新されたとき、データベースの更新と同時に、セッションデータも上書きしないといけない。
サイトの改修をかけてく中で、データを更新するページが増えたときに、うっかりその処理を入れ忘れちゃったりする可能性を考えたら、多少負荷が上がるとしても、セッションに入れるのはIDだけにして、毎回ページを読み込むたびにデータベースからユーザーデータを取るようにしといた方が良いような気がするんだけど……どうなんですかね?
2.6の場合
Authコンポーネントはデータベースからユーザーデータを取って来て、それをセッションに入れるとこまでやってくれますが、ログイン処理を実装する場合に、ユーザーデータの中でどれを取って来てセッションに入れるかは、コントローラーから指定することができます。IDだけ取ってきたいとか、メールアドレス、名前も一緒に取ってきたいとか、選べる。AppControllerとかで、以下のような記述をすれば良い。
//IDだけ
$this->Auth->authenticate = array(
'Form' => array(
'userFields' => array('User.id'),
),
);
//ID、メールアドレス、名前
$this->Auth->authenticate = array(
'Form' => array(
'userFields' => array('User.id', 'User.email', 'User.name'),
),
);
これはフォームを使ってログイン処理を実装する場合の一例です。userFieldsってやつで必要なカラムを指定するだけです。お手軽ですね。
でもこれは、CakePHPのバージョンが比較的新しいものじゃないと、設定ができません。僕が知る限りでは、バージョン2.6だったらこの設定が使えるっぽい。
2.3の場合
バージョン2.3辺りではまだ、この仕様が存在しません。以前のAuthコンポーネントは、カラムの指定ができずに、ユーザーデータを全部取ってくる仕様になってます。IDだけ欲しいと思ってる人にとっては、無駄な処理ですね。なので、もし上記の設定が使えないバージョンでIDだけ取って来るようにしたければ、ちょっと自分で改造しないといけない。Componentフォルダの中のAuthフォルダの中にBaseAuthenticate.phpってファイルがあるんですが、その中に「_findUser()」というメソッドがあるんで、その中身をちょちょっといじります。
//BaseAuthenticate.phpの_findUser
protected function _findUser($username, $password = null) {
〜中略〜
$result = ClassRegistry::init($userModel)->find('first', array(
'conditions' => $conditions,
'fields' => $userModel.'.id',//この一行を追加
'recursive' => $this->settings['recursive'],
'contain' => $this->settings['contain'],
));
〜中略〜
}
こんな風に書いちゃえば、IDだけ取って来るようになります。
これじゃあIDだけしか取ってこれないじゃん
「2.6みたくコントローラーでuserFieldsを使って指定できるようにならんの?」って思った人。オーケー、任せろ。
protected function _findUser($username, $password = null) {
〜中略〜
$result = ClassRegistry::init($userModel)->find('first', array(
'conditions' => $conditions,
'fields' => $this->settings['userFields'],//この一行を追加
'recursive' => $this->settings['recursive'],
'contain' => $this->settings['contain'],
));
〜中略〜
}
BaseAuthenticate.phpには、$settingsっていうメンバ変数があって、コントローラーからそこに値を渡すことができます。なので、$settingsの中の値を使ってカラムを指定できるようにしとけばオッケーです。
$settingsに渡せば、userFieldsに限らず、いろんな値をAuth側で使えるようになります。
//コントローラー
$this->Auth->authenticate = array(
'Form' => array(
'summer' => '超暑い! マジやべー!',
'eel' => 'そんなに夏バテに効果はない'
),
);
//BaseAuthenticate.php
protected function _findUser($username, $password = null) {
$natsu = $this->settings['summer'];
$unagi = $this->settings['eel'];
}
今年の夏は本当に超暑いっすよね〜。みなさん熱中症とか夏バテとか大丈夫ですか?
夏バテ対策にはウナギが良いなんて話も聞きますが、実際のところ、そこまで有効な食べ物ではないようです。それなら夏野菜とか食べた方が良いみたいです。
あくまでも個人的な意見ですが、Authコンポーネントからセッションに渡すデータは、IDだけで良いような気がするんですよね。もちろんサイトの仕様によりますけど。
ただ、僕の経験上、たいていのログイン処理があるサイトは、サイト上でユーザーデータを更新するベージがある。だからセッションにユーザーデータを全部入れて、必要に応じてそこから参照するようにしていると、ユーザーデータが更新されたとき、データベースの更新と同時に、セッションデータも上書きしないといけない。
サイトの改修をかけてく中で、データを更新するページが増えたときに、うっかりその処理を入れ忘れちゃったりする可能性を考えたら、多少負荷が上がるとしても、セッションに入れるのはIDだけにして、毎回ページを読み込むたびにデータベースからユーザーデータを取るようにしといた方が良いような気がするんだけど……どうなんですかね?