セッションに突っ込むのはIDだけで良くね?

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
土用丑の日にウナギを食べるのは源内の発案なんだって

おまとめ三行

userFieldsってやつで必要なカラムを指定するだけ
バージョン2.3辺りではまだ、この仕様が存在しません
みんな熱中症とか夏バテとか大丈夫ですか?

CakePHPのAuthコンポーネントを使っているっていう前提での話になりますが、よしなに。



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だけにして、毎回ページを読み込むたびにデータベースからユーザーデータを取るようにしといた方が良いような気がするんだけど……どうなんですかね?

まだコメントはいただけてないみたい……
もしかしたら何か関連しているかも?