【发布时间】:2014-01-06 13:31:48
【问题描述】:
我在我的项目中使用 CakePHP,我正在寻找一种正确的方法来检查我的视图中的高级用户权限。
我有几个页面,其中的内容取决于您的权限(您可以查看或不查看某些块,编辑或不编辑某些信息等...)
我搜索并发现唯一的方法是实现一个 Auth Helper,但我认为最好的方法是在我的“UserController”中实现方法(例如 canPerformAction($action, $controller = 'default_controller' )), 我错了吗 ?如果我是对的,如何正确调用这些方法?
谢谢。
编辑:更精确
例如,我有一个操作“editEventProducts”,用户只有在他是事件所有者并且事件状态为
我在我的控制器“isAuthorized”函数中检查了它的工作原理。
但我有一个名为“eventDetails”的页面,您可以在该表单中执行多个操作,例如这个,我想显示编辑按钮,前提是您可以做到。
如果事实上我需要的是您可以调用的每个操作的“isAuthorized”函数的输出,但我可以从视图中正确获取它吗?
解决方案
我实现了一个 Auth 助手,它进行了几次检查,例如这个,最后是一个白名单检查,取决于我的事件的状态,希望它会有所帮助,代码:
App::uses('AppHelper', 'View/Helper');
class AuthHelper extends AppHelper {
var $helpers = array('Session');
private $_whitelist = array(
'controller1' => array(
'events' => array(
'action1' => array(1 => true, 2 => true),
'action2' => array(1 => true, 2 => true),
'action3' => array(3 => true),
'action4' => array(6 => true)
)
),
'user' => array(
'controller1' => array(
'action1' => array(1 => true, 2 => true),
'action2' => array(1 => true, 2 => true)
)
)
);
public function canPerformAction ($action, $event_infos, $controller = 'events') {
return isset($this->_whitelist[$this->Session->read('Auth.User.role')][$controller][$action][$event_infos['Event']['state_id']]);
}
}
【问题讨论】:
-
目前这些权限是如何存储的?这对于正确答案至关重要。它是“user_rights”表吗?
-
目前它在 canEditEvent、canAddProducts、isAdmin 系列函数中完成,我在控制器中调用然后发送到视图。但实际上我正在考虑一个 Auth 助手,它有一个表和一个函数,如果在表中找不到,则返回相应的真/假和假。但我想知道在 MVC 理念中这是否是最好的方法。