我在我的项目中使用CakePHP,我正在寻找一种在我的视图中检查高级用户权限的正确方法。
我有几个页面,其中的内容取决于您的权利(您可以查看或不查看某些块,编辑某些信息,等等......)
我搜索过,我发现的唯一方法是实现一个Auth Helper,但我认为最好的方法是在我的“UserController”中实现方法(例如canPerformAction($ action,$ controller ='default_controller') )), 我错了吗 ?如果我是对的,如何恰当地调用这些方法?
感谢。
编辑:更精确
例如,我有一个动作“editEventProducts”,用户只有在他是事件所有者且事件状态为< = 2时才能执行。
我在我的控制器中检查“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']]);
}
}
答案 0 :(得分:2)
听起来我只想根据用户的权限渲染视图的某些部分。那么,在这种情况下,我认为帮助者是正确的选择。用户应该已经拥有了他已经加载的所有权限 - 除非它们非常精细,并且您拥有数千个权限。
选中此AuthHelper,它可以让您检查用户是否已登录,是否有字段中的角色或一组角色。或者,实施您自己的解决方案以匹配您的权限系统。
请注意,帮助程序依赖于将用户数据传递给视图变量中的视图。它还可以配置为直接从会话的auth部分读取数据。
以下是从documentation获取的示例:
if ($this->Auth->isLoggedIn()) {
echo __('Hello %s!', $this->Auth->user('username'));
}
if ($this->Auth->isMe($record['Record']['user_id']) {
// or your edit button here
echo '<h2>' . __('Your records') . '</h2>';
}
if ($this->Auth->hasRole('admin') {
echo $this->Html->link(__('delete'), array('action' => 'delete'));
}
答案 1 :(得分:1)
您需要的是授权,并且是授予/拒绝通常构建在身份验证步骤之上的操作的过程,该步骤将HTTP请求映射到逻辑用户。
授权方案可以通过多种方式实现,例如使用简单的基于角色的规则,其中用户被精确地分组以用于分配权限,或者具有更复杂的ACL(访问控制列表)。根据您的需要,两者可以同时用于系统的不同部分。
无论您选择哪种方案,您都需要在控制器操作开始时查询它(如果适用,您可以在AppController
中使用标准化授权过滤器),因为HTTP请求不是需要来自之前发送的HTTP页面,但可能是(可能)恶意的,手工制作的。此外,您可能需要在用户权限之后调整UI。也许你最好从一堆if
语句开始,然后经过几天的工作,你将能够确定你的需求并构建你的库/帮助器/块/什么来避免代码重复和简化阅读模板。
答案 2 :(得分:0)
如果您有预定义的用户权限(例如'admin','moderator','editor','publisher'...),您只需读取控制器函数isAuthorized中的用户角色和当前操作,并将其设置为true或者是假的。
如果您希望每个用户拥有自定义权限,您可以将这些值存储在数据库中,在isAuthorized函数中读取它们并使您的逻辑确定是否应该允许他。
我对此的解决方案是一个单独的表user_permissions
,如下所示:
user_id | action
其中action将是`controller / action'或'view / block'或者你想要保存的任何内容。
我会读取控制器中当前用户的所有值,如果在数组中找到当前控制器/操作,我将isAuthorized设置为true。您也可以将逻辑应用于块。
答案 3 :(得分:-2)
您可以使用
从视图中调用控制器的功能requestAction(string $url, array $options)
或者您可以创建自定义助手,为您执行此操作!