CakePHP ACL:如何实现这个案例?

CakePHP ACL:如何实现这个案例?,php,cakephp,cakephp-2.0,cakephp-acl,Php,Cakephp,Cakephp 2.0,Cakephp Acl,因为我已经试着找到一个好的方法来制作这个大约两个星期了,我想问问是个好主意 我有两个User角色:editor和admin。每个编辑都有一系列区域通过$hasandbelongtomany分配给他 在应用程序中,我还有一个模型事件,通过区域id,每个模型都有一个区域。我想确保每个编辑只能查看、编辑、删除和执行其任务的区域中的事件。管理员用户当然可以编辑任何内容 如何在CakePHP模型和控制器中以最少的麻烦实现这一点?您可以在事件控制器的edit方法的前几行中处理这一点。查找事件的区域,然后检查

因为我已经试着找到一个好的方法来制作这个大约两个星期了,我想问问是个好主意

我有两个
User
角色:
editor
admin
。每个
编辑
都有一系列
区域
通过
$hasandbelongtomany
分配给他

在应用程序中,我还有一个模型
事件
,通过
区域id
,每个模型都有一个
区域
。我想确保每个
编辑
只能查看、编辑、删除和执行其任务的
区域
中的
事件。
管理员
用户当然可以编辑任何内容


如何在CakePHP模型和控制器中以最少的麻烦实现这一点?

您可以在
事件控制器
edit
方法的前几行中处理这一点。查找事件的区域,然后检查登录的编辑器是否为该区域的编辑器。您需要做的就是确保当用户登录时,他/她的角色保存在
AuthComponent
的会话中。例如:

public function edit($event_id = null) {
    if($this->Auth->user('role') == "editor") {
        // User is logged in as editor, check if the Event region matches his regions.
        $event = $this->Event->findById($event_id); // Get the event
        $user = $this->Event->User->findById($this->Auth->user('id')); // Get the user (Assuming an Event belongsTo user, otherwise you'll have to load the model first).

        if(!array_search($event['Event']['region_id'], $user['User']['Region'])) {
            // The event's region wasn't found in the Regions for the User, deny access
            $this->Session->setFlash(__('You are not authorized to edit this event.'));
            $this->redirect(array('action' => 'view', $event_id));
        }
    }
}

因此,基本上在执行任何其他逻辑之前,先检查用户是否是编辑器,如果是,则检查他关联的区域是否与当前事件的区域匹配。如果未设置,则会设置一条flash消息,并将用户踢回事件的
视图。

因此根本不需要ACL?那么
是否已授权
?ACL仅用于确定经过身份验证的用户是否有权访问控制器中的特定操作。在这种情况下,编辑器和管理员都有访问权限,您只需要额外检查是否允许他们编辑特定事件。ACL不会检查这种模型关系。