【问题标题】:Modifying view based on ACL in CakePHPCakePHP中基于ACL修改视图
【发布时间】:2010-07-19 02:09:48
【问题描述】:

我希望能够在基于 ACL 的视图中显示或隐藏某些元素。例如,如果用户正在查看我的用户/索引视图,如果他没有删除用户的权限,我不想显示“删除用户”元素。如果他确实有权编辑用户,我确实想显示一个“编辑用户”链接。

我可以一起解决这个问题,但对 Cake 很陌生,我希望有一个优雅的解决方案。我做过的最好的事情是将逻辑保存在两个地方,所以维护起来很麻烦。

谢谢!

【问题讨论】:

    标签: model-view-controller cakephp acl


    【解决方案1】:

    我知道这是一个老问题了,但对于任何想像我一样寻找方式的人......

    在 AppController::beforeFilter 中,您可以将 ACL 组件分配给视图变量,然后在您的视图中使用它:

    $this->set('user', $this->Auth->user());    
    $this->set('acl', $this->Acl);
    

    然后在你看来,就像你一样:

    if($acl->check(array('User' => $user), 'controllers/groupd/admin_delete')) {
    

    这不一定是最正确的方法,但效果很好

    【讨论】:

      【解决方案2】:

      没有通用的“优雅解决方案”:) 我也一直想做这样的事情。无论如何你怎么能做到:

      覆盖应用目录中的 Html Helper - 从 /cake/libs/views/helpers/html.php 复制到 /app/views/helpers/html.php 并在 Html::link 函数中进行一些更改.

      例如,您可以检查 url 是否包含操作编辑或删除。

      另一部分是从控制器传递适当的参数。在 AppController::beforeFilter 中,您可以读取用户的权限(最好是缓存)并将其通过特殊的 Auth 变量传递给 View。

      因此,当您在视图中拥有权限时,可以轻松修改链接。 :)

      正如我所说,我没有在实际示例中这样做,但我会这样做。

      这有 1 个不好的地方 - 如果原来的 Html 帮助器被改变,你的帮助器将保持不变。但我相信 Html helper 已经足够成熟,所以对我来说不是什么大问题。

      【讨论】:

        【解决方案3】:

        我在 app_controller.php 中这样做,尽管您也可以在特定控制器中这样做。视图变量$usersIndexAllowed$configureAllowed 然后在视图中的条件语句中使用。

        function beforeRender()
        {
            if($this->layout=='admin')
            {
                $usersIndexAllowed = $this->Acl->check($user,"users/index");
                $configureAllowed = $this->Acl->check($user,"siteAdmins/configure");
            }
            $this->set(compact('usersIndexAllowed','configureAllowed'));
        }
        

        【讨论】:

          【解决方案4】:

          如果您不想弄乱覆盖核心助手并且想要一种更自动的检查方式(无需硬编码用户组名称和用户或设置单独的链接特定变量),这是我的建议:

          在用户登录时将所有用户权限存储为会话变量(注销时清除)并创建权限帮助程序以检查登录用户是否具有特定操作的权限。

          代码和示例here

          希望对你有帮助

          【讨论】:

            【解决方案5】:

            这种情况有多种方法。正如 Nik 所说,使用帮助程序为您进行检查是一种“外包”逻辑并将其集中起来以方便使用的快速方法。

            实际上,看看AclLinkHelper - 它完全符合您的要求,但仅限于链接。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-08
              • 1970-01-01
              • 1970-01-01
              • 2012-02-14
              • 1970-01-01
              • 2017-12-24
              相关资源
              最近更新 更多