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

CakePHP ACL为不同的组生成不同的链接,php,cakephp,Php,Cakephp,使用CakePHP2.0的ACL,我创建了两个组。一个是管理员,一个是访客。现在管理员可以添加和上传图片,访问者只需查看图片,如果他们点击添加或删除,它不会让他们做任何事情。为访客群删除这些链接的最佳方式是什么?如果我使用If/else语句检查它们属于哪个组,这是最好的解决方案吗?要隐藏导致用户无权执行的操作的链接,视图必须知道用户权限。 您可以通过检查用户所属的组来检查这些权限,但这意味着您将不再依赖ACL权限。因此,任何ACL权限更新都必须在代码中报告。不是很方便 那还有什么?一种方法是检查

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

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

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

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

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

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

如果我有多个控制器(大约100个),并且每个控制器有5个或更多方法,这会影响性能吗?@gvLearner正如我提到的,它会影响登录时间,因为一旦用户通过身份验证,就会检查权限。在您的例子中,AclComponent->check()方法在登录时会被调用大约500次。这显然是一个缺点。但是,一旦登录完成,它几乎不会影响性能(只使用对一些
路由器
方法的一些调用来比较会话中的操作链接和权限)。