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,$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') 虽然看起来你似乎不需要那样. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |