【问题标题】:CakePHP : Check authorizations in viewsCakePHP:检查视图中的授权
【发布时间】: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 理念中这是否是最好的方法。

标签: cakephp view rights


【解决方案1】:

您可以使用视图调用控制器的功能

requestAction(string $url, array $options) 

或者您可以创建您的自定义 Helper 来为您执行此操作!

【讨论】:

  • 是的,我知道我可以调用控制器,但这是一个非常糟糕的方法,我真的在寻找最好的方法来做到这一点。目前我从控制器调用该函数并将结果发送到视图,但高级权限变得越来越复杂
  • 在 AppController 中创建一个动作,该动作将在 beforAction() 函数中调用并在那里设置您的权限....
  • 总有改进的余地......没有什么比得上最好的了
【解决方案2】:

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

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

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

【讨论】:

  • 感谢您的回答。我确实检查了这些权利。其实问题不在这里,我会尽量说清楚。例如,我有一个操作“editEventProducts”,用户只有在他是事件所有者并且事件状态为
  • 视图中的逻辑越少越好。我认为一种可能的方法是检查eventDetails 操作中的用户权限,并向视图发送可以执行的操作的白名单。这样视图就不必查询授权层本身。然后模板将检查白名单以决定是否绘制按钮。白名单可以是符号数组,也可以是视图中的一堆布尔标志,如$canDoThis$canDoThat
  • 哦,还不错。你的意思是我发送一个例如基于键的登录用户可以执行的操作的列表,我检查是否执行 isset 例如?你认为这比调用自定义助手更好吗?
  • 其实你可以自己构建Helper来实现白名单的方式
  • 是的,这就是我所做的,我只是检查白名单中是否存在密钥,以便它是一个单行函数。我将编辑第 1 个帖子
【解决方案3】:

如果您有预定义的用户权限(例如“admin”、“moderator”、“editor”、“publisher”...),您可以在控制器函数 isAuthorized 中读取用户角色和当前操作并将其设置为 true或假的。

如果您想要每个用户的自定义权限,您可以将这些值存储在数据库中,在 isAuthorized 函数中读取它们并制定您的逻辑来确定您是否应该允许他。

我对此的解决方案是一个单独的表 user_permissions,它是这样的:

user_id | action

action 可以是 `controller/action' 或 'view/block' 或任何你想保存在那里的东西。

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

【讨论】:

    【解决方案4】:

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

    检查这个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'));
    }
    

    【讨论】:

    • 是的,我认为这绝对是最好的选择。这有点令人沮丧,因为它与“isAuthorized”函数的逻辑完全相同。
    • 您可以在控制器中使用if ($this-&gt;Auth-&gt;role('admin')) { $this-&gt;set('admin', true); } 之类的内容执行此操作,然后在视图中检查$admin。但是AuthHelper 似乎是一个更好的方法。
    • 好吧,你必须为每个角色设置它,然后在视图中你必须检查 if (isset($admin) && $admin === true))。帮助器有助于减少您必须编写的代码量。它还封装了检查逻辑。如果您的应用需要一些特殊的东西,只需扩展它并加载您自定义的 AuthHelper 别名为 Auth 助手。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多