我想基于登录查看记录的用户来限制记录。
例如,我有以下两个模型:
Assignments
Users
因此,如果学生(用户)正在查看作业摘要,则他应该只能看到他的作业,并且只能执行查看/删除/编辑他的作业。
但是,如果教师(用户)正在查看作业摘要,则他应该看到所有作业,并且可以对所有作业执行添加/编辑/删除。
我已经知道我可以通过将组条件放在“查找”中,然后在视图/编辑/删除操作中适当使用代码来做到这一点。
我的问题是-在cakephp中处理此类情况的最佳方法是什么?对我来说,把条件放到任何地方似乎都不是好方法。
考虑作为两个独立的问题来解决
第一个是如何拒绝学生,例如仅仅操纵url试图查看/编辑/删除他们不拥有的东西的学生。对于isAuthorized的使用,书中有一个示例,该示例适用于问题中的信息,该示例为:
// app/Controller/AppController.php
public $components = array(
'Session',
'Auth' => array(
'authorize' => array('Controller') // Added this line
)
);
public function isAuthorized($user) {
// Teachers can access/do everything - adapt to whatever identifies a teacher
if ($user['is_teacher'])) {
return true;
}
// Anyone logged in can access the index
if ($this->action === 'index') {
return true;
}
// The owner of a whatever can view, edit and delete it
$id = $this->request->params['pass'][0];
$owner = $this->{$this->modelClass}->field('user_id', array('id' => $id));
if ($owner === $user['id'])) {
return true;
}
// Default deny
return false;
}
从2.1开始可用的事件系统是实施上述数据限制的一种简便方法。再次在书中有一个相关示例,它适合于问题中的信息,该示例为:
// app/Controller/AssignmentsController.php
public function beforeFilter() {
if (!$this->Auth->user('is_teacher')) {
$currentUser = $this->Auth->user('id');
$this->Assignment->getEventManager()->attach(
function(CakeEvent $e) use ($currentUser) {
$e->data[0]['conditions']['user_id'] = $currentUser;
return $e->data[0];
},
'Model.beforeFind'
);
}
}
这将为user_id
所有查找添加条件,因此索引列表将仅显示他们自己的作业,而对于教师,它将显示所有作业。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句