【问题标题】:CakePHP ACL generating different links for different groupsCakePHP ACL 为不同的组生成不同的链接
【发布时间】:2012-05-19 10:10:18
【问题描述】:

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

【问题讨论】:

    标签: php cakephp


    【解决方案1】:

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

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

    但对于链接,您可以走得更远,避免在视图中编写测试。我个人使用从 HtmlHelper 继承并覆盖 link() 方法的助手。 基本上它的工作原理是相同的:在被覆盖的 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 检查与组件高度耦合。

    【讨论】:

    • 如果我有很多控制器(大约 100 个并且)每个控制器有 5 个或更多方法,会影响性能吗?
    • @gvLearner 正如我提到的,它会影响登录时间,因为一旦用户通过身份验证,就会检查权限。在您的情况下, AclComponent->check() 方法将在登录时调用大约 500 次。这显然是一个缺点。但是,一旦登录完成,它几乎不会影响性能(只是调用了一些Router方法来比较操作链接和会话中的权限)。
    猜你喜欢
    • 2018-02-11
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    相关资源
    最近更新 更多