AuthのuserScopeにご用心

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
結構Authにやられてるな……自分

おまとめ三行

Cake1.3から2系に乗り換える方はご用心
AuthのuserScopeを使ってる方はご用心
僕のようにね

CakePHPのバージョンを1.3(1.2でも良いと思うけど)から2.3とかにアップグレードした場合。

1.3のAuthコンポーネントで「userScope」っていうのがあるんですけど、2.3だとこの書き方が違ってたりして、これをうっかり見逃すと狙い通りの挙動をしてくれないのです。僕のようにね。

あれだね。1.3から2系に移し替える時には、どこが変わってるのか、ドキュメントをちゃんと読んどけっつー話だよね。そういうのサボるから、こんなことになるっつー話だよね。僕のようにね。



1.3のuserScope

例えば……ログイン認証に使うフィールドが「username」と「password」で、その他に、「status」っていうフィールドの値が1のユーザーだけログインできるようにする。

そんな場合は、こんな風に書くことになると思います。

$this->Auth->fields = array('username' => 'username', 'password' => 'password');
$this->Auth->userScope = array('status' => 1);

こう書いとくと、ログイン認証時、データベースからユーザーデータを取得してくるとき、SQLのWHEREに「status = 1」ってのが追加されます。

うん、まあ、特に問題はないっすよね。

でもこのままCake2.3に乗り換えると、よろしくない。statusが1以外のユーザーの認証が通っちゃう。取ってきてはいけないユーザーデータを取ってきてしまう。



2.3のuserScope

じゃあどう書くかってことなんですけど、手っ取り早く結論だけ言うと、こう↓

$this->Auth->authenticate = array(
  'Form' => array(
    'fields' => array('username' => 'email', 'password' => 'password'),
    'scope' => array('status' => 1),
  ),
);	

これはログイン認証にフォームを使用する場合なんですけど、まあその辺の細かい説明は今回は省略するとして……ようは、「$this->Auth->authenticate」っていうところで、ひとまとめに設定事項を書く感じですね。

その他にも、ログイン認証に使うモデルを指定するuserModelとかも、1.3のときは「$this->Auth->userModel = ‘User’」とか書いてたのを、2.3ではやっぱり「$this->Auth->authenticate」の中にまとめて記述する感じですね。

$this->Auth->authenticate = array(
  'Form' => array(
    'fields' => array('username' => 'email', 'password' => 'password'),
    'scope' => array('status' => 1),
    'userModel' => 'User',
  ),
);		






いつもながら些細なことなんですけどね。でもちりも積もれば何とやらって言いますし、こういう些細なミスが積もり積もると、お客さんからどでかいクレームが来たりして、胃がキリキリと痛み出し、夜も眠れず昼寝するハメになるんですよ。

僕のようにね。

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