CakePHP 2.2を使用して、各クライアントが独自のデータの「レルム」を持ち、他のデータが表示されないアプリケーションを構築しています。たとえば、クライアントには、ユーザー、コース、請負業者、および仕事のセットがあります。グループはクライアント間で共有されますが、グループに対してアクションを実行することはできません。グループでできるすべてのクライアントは、グループをユーザーに割り当てることです。したがって、管理者(ACLを使用)は、同じクライアントIDからのデータのみを管理できます。
私のすべてのオブジェクト(もちろんグループを除く)にはclient_idキーがあります。
今、私はこれを成し遂げて実際にうまく機能させるための1つの方法を知っていますが、それは少し汚いようで、もっと良い方法があるかどうか疑問に思っています。プロジェクトの初期段階でCakePHPを初めて使用するので、私はそれを正しく理解したいと思っています。
これは私が今それをしている方法です:
1-ユーザーがログインします。ユーザーのテーブルのデータに従って、彼のclient_idがセッションに書き込まれます。
$user = $this->User->read(null, $this->Auth->user('id'));
$this->Session->write('User.client_id', $user['User']['client_id']);
2- AppControllerには、そのセッションIDを特定のパラメーターと比較する保護された関数があります。
protected function clientCheck($client_id) {
if ($this->Session->read('User.client_id') == $client_id) {
return true;
} else {
$this->Session->setFlash(__('Invalid object or view.'));
$this->redirect(array('controller' => 'user', 'action' => 'home'));
}
}
3-さまざまなインデックスアクション(各インデックス、各関連コントローラー)を使用して、paginate条件を使用してclient_idを確認します。
public function index() {
$this->User->recursive = 0;
$this->paginate = array(
'conditions' => array('User.client_id' => $this->Session->read('User.client_id'))
);
$this->set('users', $this->paginate());
}
4-他のアクションでは、この方法でHTTPリクエストタイプをチェックする前にclient_idをチェックします。
$user = $this->User->read(null, $id);
$this->clientCheck($user['User']['client_id']);
$this->set('user', $user);