CakePHP:检查视图中的授权

CakePHP:检查视图中的授权,cakephp,view,rights,Cakephp,View,Rights,我在我的项目中使用CakePHP,我正在寻找一种适当的方法来检查视图中的高级用户权限 我有几个页面,其中的内容取决于您的权限(您可以查看或不查看某些块,编辑或不编辑某些信息,等等) 我搜索了一下,发现唯一的方法是实现Auth助手,但我认为最好的方法是在我的“UserController”中实现方法(比如canPerformAction($action,$controller='default\u controller')),我错了吗?如果我是对的,如何正确调用这些方法 谢谢 编辑:更精确 例如,

我在我的项目中使用CakePHP,我正在寻找一种适当的方法来检查视图中的高级用户权限

我有几个页面,其中的内容取决于您的权限(您可以查看或不查看某些块,编辑或不编辑某些信息,等等)

我搜索了一下,发现唯一的方法是实现Auth助手,但我认为最好的方法是在我的“UserController”中实现方法(比如canPerformAction($action,$controller='default\u controller')),我错了吗?如果我是对的,如何正确调用这些方法

谢谢

编辑:更精确


例如,我有一个“editEventProducts”操作,只有当用户是事件所有者并且事件状态为时,用户才能执行该操作,您可以使用

requestAction(string $url, array $options) 
或者,您可以创建自定义帮助器,它将为您执行此操作

您需要的是授权,授权/拒绝操作的过程通常建立在身份验证步骤之上,该步骤将HTTP请求映射到逻辑用户

授权方案可以通过多种方式实现,例如使用简单的基于角色的规则,其中用户分组的目的是分配权限,或者使用更复杂的ACL(访问控制列表)。根据您的需要,这两种方法可同时用于系统的不同部分


无论您选择什么方案,您都绝对需要在控制器操作开始时查询它(如果适用,您可以在
AppController
中使用标准化的授权过滤器),因为HTTP请求不需要来自以前发送的HTTP页面,但可能是恶意的,手工制作的。此外,您可能需要在获得用户权限后调整UI。也许你最好从一堆
if
语句开始,然后经过几天的工作,你将能够确定你的需求并构建你的库/助手/块/任何东西,以避免代码重复并简化模板的阅读。

如果你有预定义的用户权限(如“管理员”、“版主”、“编辑”、“发布者”…)您只需读取“控制器”函数中的用户角色和当前操作,然后将其设置为true或false

如果需要每个用户的自定义权限,可以将这些值存储在数据库中,在isAuthorized函数中读取这些值,并通过逻辑确定是否应允许他

我的解决方案是一个单独的表
user\u permissions
,类似这样:

user_id | action
其中操作将是“控制器/操作”或“视图/块”或任何您想保存在那里的内容


我会读取控制器中当前用户的所有值,如果在数组中找到当前控制器/操作,我会将isAuthorized设置为true。您也可以将逻辑应用于块。

我觉得您只是想根据用户的权限渲染视图的某些部分。嗯,在这种情况下,我认为助手是正确的选择。用户应该已经拥有他加载的所有权限——除了它们是非常细粒度的,并且您拥有数千个权限

选中此项,您可以检查用户是否已登录,以查看字段中的一个角色或一组角色。或者,实现您自己的解决方案,以匹配您的权限系统

注意,助手依赖于在视图变量中将用户数据传递给视图。还可以将其配置为直接从会话的auth部分读取数据

以下是从它的

if($this->Auth->isLoggedIn()){
echo _u('Hello%s!',$this->Auth->user('username');
}
如果($this->Auth->isMe($record['record']['user\u id'])){
//或您的编辑按钮在这里
回显“.”(“您的记录”);
}
如果($this->Auth->hasRole('admin')){
echo$this->Html->link('delete')、array('action'=>'delete');
}

是的,我知道我可以调用控制器,但这是一种非常糟糕的方法,我正在寻找最好的方法。目前我从控制器调用函数,并将结果发送到视图,但随着高级权限的增加,在AppController中创建一个操作变得越来越复杂,这将在beforAction()中调用功能和设置您的权限…总有改进的余地…没有比bestHow更好的方法了这些权限当前是如何存储的?这对于正确回答至关重要。它是“用户权限”吗表?目前,它是在CanedEvent、CanadProducts、isAdmin系列函数中完成的,我在控制器中调用这些函数,然后将它们发送到视图。但实际上,我想到的是一个身份验证助手,它有一个权限表和一个函数,如果在表中找不到,则返回相应的true/false和false。但我想知道这是否是最好的方法在MVC理念中,我很乐意这样做。谢谢你的回答。我确实检查了这些权限。事实上,问题不在这里,我会尽量弄清楚。例如,我有一个动作“editEventProducts”只有当用户是事件所有者且事件状态在视图中的逻辑性越低时,用户才能执行该操作越好。我认为一种可能的方法是在
eventDetails
操作中检查用户的权限,并向视图发送可执行操作的白名单。这样视图就不必查询授权层本身。然后模板将检查白名单以决定是否绘制按钮。白名单可以是一个符号数组,也可以是视图上的一组布尔标志,如
$canDoThis
$canDoThat
,等等。这还不错。您的意思是我发送了一个基于键的列表,例如记录用户可以执行的操作例如,orm和我检查做一个isset?你认为这比调用一个自定义帮助程序好吗?实际上你可以构建自己的帮助程序来实现白名单方法是的,这就是我所做的,我只是检查密钥是否存在
user_id | action
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'));
}