使用 CakePHP 2.2,我正在构建一个应用程序,其中每个客户端都有自己的数据“领域”,而其他数据对他们来说是不可见的。例如,客户有他的一组用户、课程、承包商和工作。组在客户端之间共享,但它们不能对组执行操作。所有客户端可以对组做的就是将它们分配给用户。因此,管理员(使用 ACL)只能管理来自相同客户端 ID 的数据。
我所有的对象(当然,组除外)都有 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 中,我有一个受保护的函数,可以将该会话 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- 我的不同索引操作(每个索引,每个相关控制器),我使用分页条件检查 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);