CakePHP ACL为不同的组生成不同的链接


CakePHP ACL generating different links for different groups

使用 CakePHP 2.0 的 ACL,我创建了 2 个组。一个是管理员,一个是访客。现在管理员可以添加和上传图像,访问者只能查看图像,如果他们单击添加或删除,它不会让他们做任何事情。为访客组删除这些链接的最佳方法是什么?如果我使用 if/else 语句检查它们属于哪个组,那会是最好的解决方案吗?

若要隐藏导致用户无权执行的操作的链接,视图必须以某种方式了解用户权限。您可以通过检查用户所属的组来检查这些权限,但这意味着您将不再依赖 ACL 权限。因此,任何 ACL 权限更新都必须在代码中报告。不是很方便。

那还有什么?一种方法是在控制器中检查用户权限(通常在登录期间(,然后将这些权限保留在会话中。然后,可以在视图中检查会话中的权限,以隐藏或显示视图的某些部分。您可以在此处找到此方法的示例:

但是对于特定的链接,您可以走得更远,避免在视图中编写测试。我个人使用了一个从 HtmlHelper 继承并覆盖 link(( 方法的帮助程序。基本上它的工作原理是相同的:在 overriden link(( 方法中,检查对目标操作的权限,帮助程序返回链接,或者如果不允许用户访问目标操作,则什么都不返回。

如果你想尝试我的代码,你可以使用我的 Acl 插件

在应用控制器中,设置权限:

var $components = array(..., 'Acl.AclManager');
function beforeFilter()
{
    ...
    //you can put it here as the permissions check is performed only once per session
    $this->AclManager->set_session_permissions();
    ...
}

在您的视图中,使用 AclHtmlHelper

$this->AclHtml->link(...);

关于此方法所基于的原则的一般评论:登录期间检查所有权限。如果应用程序中有许多操作,这可能会大大减慢登录速度。

更有效的方法是仅在需要时检查每个操作的用户权限,这意味着在调用 link(( 方法时。但这意味着帮助程序必须检查 Acl 权限本身,这会以某种方式破坏 MVC 模型。在核心库中,ACL 检查与组件高度耦合。