Используя CakePHP 2.2, я создаю приложение, в котором каждый клиент имеет свою собственную «область» данных, и никакие другие данные им не видны. Например, у клиента есть свой набор пользователей, курсов, подрядчиков и вакансий. Группы являются общими для клиентов, но они не могут выполнять действия над группами. Все, что клиенты могут делать с группами, это назначать их пользователям. Таким образом, администратор (используя ACL) может управлять данными только с одного и того же идентификатора клиента.
Все мои объекты (кроме групп, конечно) имеют ключ client_id.
Теперь я знаю один способ сделать это и заставить его работать хорошо, но он кажется немного грязным, и мне интересно, есть ли лучший способ. Будучи в начале проекта и новичком в 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 у меня есть защищенная функция, которая сравнивает этот идентификатор сеанса с заданным параметром.
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- Я использую разные действия с индексами (каждый индекс, каждый соответствующий контроллер), я проверяю 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- В других действиях я проверяю client_id перед проверкой типа HTTP-запроса таким образом.
$user = $this->User->read(null, $id);
$this->clientCheck($user['User']['client_id']);
$this->set('user', $user);