CakePHP2、Authコンポーネントでログインの条件を追加


cakephpの認証と言えばAuthだが、とても便利なものなのだが、usernameとpassword以外に追加の条件を追加したい、ということになると途端に面倒になる。

自分も過去以下のような記事を書いているが。。。

いざ実装してみるとうまくいかないことが多い。

例えば今回はユーザーがある場所に所属していて、場所Aにログインできるユーザー、場所Bにログインできるユーザー、どちらにもログインできるユーザーがあるようなケースでどうするか、というので悩んでいた。

なにかやり方があって追加の条件を追加できるのではないだろうかと。。。

だがしかし思ったのだが、別に認証は認証でusernameとpasswordだけで済まして、その後で追加の項目について自分で実装すればよいのでは?

追加の項目がだめだったらログアウトさせてしまえばよいのでは?

というのが私のたどり着いた結論である。

UsersController.php
            if ($this->Auth->login()) {
                // ここでログインしたユーザーIDと場所のIDを使ってさらに認証する
                $options = array('conditions' => array(
                    'UsersPlace.user_id' => $this->Auth->user('id'),
                    'UsersPlace.place_id' => $this->request->data['User']['place_id'],
                ));
                $count = $this->UsersPlace->find('count', $options);
                if ($count > 0) {
                    // 認証OKなら場所IDをAuthのセッションに追加してリダイレクト
                    $user['User'] = $this->Auth->user();
                    $user['User']['place_id'] = $this->request->data['User']['place_id'];
                    $this->Session->write("Auth", $user);
                    $this->redirect($this->Auth->redirect());
                } else {
                    // NGならログアウトして帰る
                    $this->Auth->logout();
                    $this->Flash->error(__('Invalid username or password, try again'));
                }
            } else {
                $this->Flash->error(__('Invalid username or password, try again'));
            }

考えすぎだった〜。