php – 根据特定客户端ID过滤对控制器操作的访问的最佳方法

使用Cake
PHP 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);

最佳答案 这个概念很好 – 它并不“脏”,而且与我处理这种情况的方式完全一样.

你刚刚得到了几行冗余代码.第一:

$this->Auth->user('id')

该方法实际上可以为登录用户获取任何字段,因此您可以执行以下操作:

$this->Auth->user('client_id')

你的两行:

$user = $this->User->read(null, $this->Auth->user('id'));
$this->Session->write('User.client_id', $user['User']['client_id']);

不需要.您无需重新读取用户或向会话写入任何内容 – 只需在您需要时直接从Auth获取client_id.

事实上,如果您阅读http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#accessing-the-logged-in-user,它甚至表示您可以从控制器的上下文之外获取它,使用静态方法,如:

AuthComponent::user('client_id')

虽然看起来你似乎不需要那样.

点赞