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

时间:2012-05-10 19:17:28

标签: php cakephp

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

1 个答案:

答案 0 :(得分:1)

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

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

但是对于链接而言,您可以更进一步,避免在视图中编写测试。我个人使用从HtmlHelper继承并重写link()方法的助手。 基本上它的工作原理相同:在overriden link()方法中,检查目标操作的权限,帮助程序返回链接,如果不允许用户访问目标操作,则不执行任何操作。

如果您想尝试我的代码,可以使用我的Acl plugin

在AppController中,设置权限:

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检查高度耦合到组件。