【问题标题】: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 - 它完全符合您的要求,但仅限于链接。