【问题标题】:CakePHP - restricting editing to your own "data"CakePHP - 将编辑限制为您自己的“数据”
【发布时间】:2011-07-20 13:27:26
【问题描述】:

目前我使用 Auth 组件让用户登录/注销 - ACL 被定义为在用户组(Guests、Users、Admins)之间进行排序 - 有明显的限制;管理员可以访问所有内容,用户只能访问用户控制器中的编辑,而访客只能看到显示/索引/视图等。

现在为了防止用户编辑另一个用户 - 我有一个名为 isOwner() 的函数,它基本上检查您是否正在尝试编辑自己的个人资料;并检查是否是管理员尝试编辑。如果用户是他们正在尝试编辑的内容的所有者,那么它会允许它,否则它只会使用 Flash 消息进行重定向。

阅读了http://book.cakephp.org/view/1245/Defining-Permissions-Cake-s-Database-ACL - 我想知道是否可以在 ACL 中定义它?

类似的东西:

$this->Acl->allow(array('model' => 'User', 'foreign_key' => $id), 'Users', 'edit', $id) 

虽然我没有深入挖掘,但我假设我必须使用上面的行为每个注册的新用户制作某种 beforeSave() 以允许编辑他的个人资料。

【问题讨论】:

  • 不是真的 - 我实际上想使用 ACO_ARO 获得权限,而不是离开它。
  • Cake 的 ACL 使用起来很痛苦,不知道你为什么对它如此热衷。但是既然你使用了 Auth,或许我可以建议你将 $this->Auth->user() 的内容设置为静态变量,然后你就可以在你的模型方法中访问这些值了。另外,我不会使用回调,因为它会使调试变得困难。
  • 我不同意 - 我认为 ACL 非常强大,并且可以轻松地在大型应用程序中获得用户权限。我确实有 $this->Auth->user() 作为可随处访问的静态变量,但它与上述问题并没有真正相关?我发现回调很好 - 并不比 ACL 本身更难。
  • 嘿,shaz,用户如何访问另一个配置文件? users/edit 操作不应采用 id 参数,它应始终假定发出请求的登录用户的 id。我错过了什么吗?

标签: authentication cakephp cakephp-1.3 access-control


【解决方案1】:

[我决定将其发布为答案,因为它包含代码示例]

您可以创建一个组件(或一个函数)并在 app_controller 中使用 beforeFilter() 回调,这样您就不需要手动将函数添加到所有控制器。

您还可以为操作使用多个前缀(请参阅核心中的Routing.prefixes),这样可以更轻松地控制访问。比如:

[app_controller.php]

function beforeFilter() {
    if(isset($this->params['prefix']) && $this->params['prefix'] == 'admin'){
         if(!isAdmin() || !isOwner())
             $this->cakeError('error404');
    }
}

[users_controller.php]

  function admin_edit($id = null){
        ... // edit as usual
    }

在 LAMP 堆栈中,您的瓶颈通常在数据库中

我对 cake 的问题是它提出的查询数量。一旦我看到我的“联系人”页面进行了 21 次查询,只是为了检索数据结构和此公共页面的权限。

证明使用 ACL 访问数据的唯一方法是权限是动态的,即“用户#29 可以编辑用户#12,因为管理员在后台决定了它”。但是,如果您有访问数据的静态规则(例如“用户只能编辑他们自己的信息,而管理员可以编辑所有内容”),那么在您已经知道答案的情况下执行查询就没什么用了,因为这条规则不会及时改变。

所以这一切都取决于您的应用程序。最后,最后一个想法,如果您仍打算进行更多查询 =P,您可以set the authorize method of the Auth component。但是为此使用 ACL 组件,在我看来是个坏主意

干杯!

【讨论】:

  • 与我想要的不同,但仍然是一个非常好的选择,谢谢!
【解决方案2】:

好吧,已经快 4 年了,但是对于像我这样的人来说,在研究 CakePHP 应用程序的 Acl 解决方案时会偶然发现;简短的回答是肯定的,但必须仔细计划。如果您真的需要这种级别的身份验证,那么实际上并没有替代 Cake 的 ACL 实现的可行替代方案,这至少是合理的(不进行批评......)。注意当前的稳定版本是 2.4:

本质上,解决方案是将代码中的 isOwner() 调用替换为 $dbAcl->check($user, $entity, $action);,它会查找 ACL 数据库结构 - 请参阅 http://api.cakephp.org/2.4/class-DbAcl.html

当然还有更多。对于这种类型的身份验证,CakePHP 在entity 级别没有为您提供开箱即用的解决方案。它为您提供了一个可用于构建的工具包:

  • 用于查询 ACL 数据库结构的 DbAcl。
  • Acl 行为。您要对其应用实体级授权的对象类的模型应加载 Acl 行为。这会自动创建和删除对象级 ACO/ARO,处理那里的一切。见http://api.cakephp.org/2.4/class-AclBehavior.html
  • 使用 Controller::isAuthorized() 进行控制器级别授权。您可以在此处致电dbAcl::check()。见http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#authorization。如果您真的需要,也可以从自定义授权模块中执行此操作。
  • 仍然需要通过使用 CRUD 或 Action Authorize 组件来补充这一点。重要的是要意识到在默认的 CakePHP 烘焙控制器中有 2 个隐式的动作/端点子类。作用于控制器本身的那些(添加、索引)和作用于控制器所代表的对象类的实体的那些(编辑、查看、删除)。这类似于类与实例方法。所描述的授权类型仅适用于作用于实体的端点。其余的你回退到 Action/Crud 身份验证。
  • 您显然需要一个用户模型..

请注意,ACL 的 Cake 文档末尾有两个很好的教程 - http://book.cakephp.org/2.0/en/tutorials-and-examples。他们没有明确介绍这种类型的设置,但如果您了解所涵盖的概念以及dBAcl,您应该能够按照自己的方式行事。

【讨论】:

    猜你喜欢
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多