目前我使用Auth Component供用户登录/注销 - ACL被定义为在用户组(来宾,用户,管理员)之间进行排序 - 具有明显的限制;管理员可以访问所有内容,用户只能访问用户控制器中的编辑,而访客只能看到显示/索引/视图等等。
现在为了防止用户编辑其他用户 - 我有一个名为isOwner()的函数,它基本上会检查您是否正在尝试编辑自己的配置文件;并检查是否是管理员试图编辑。如果用户是他们尝试编辑的内容的所有者,那么它允许它,否则它只是重定向闪存消息。
阅读了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()以允许编辑他的个人资料。
答案 0 :(得分:2)
[我决定将其作为答案发布,因为它包含代码示例]
您可以创建一个组件(或函数)并在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堆栈中,您的瓶颈通常在数据库中
我的蛋糕问题是它的查询次数。有一次,我看到我的“联系”页面只进行了21次查询,以检索数据结构,以及此公共页面的权限。
证明使用ACL访问数据的唯一方法是权限是动态的,即“用户#29可以编辑用户#12,因为管理员在后台确定了”。但是,如果您有访问数据的静态规则(例如“用户只能编辑自己的信息,管理员可以编辑所有内容”),那么当您已经知道答案时,执行查询就没用了,因为这个规则不会及时改变。
所以这一切都取决于你的应用..最后,最后一个想法,如果你仍然计划进行更多的查询= P你可以set the authorize method of the Auth component。但是使用ACL组件,在我看来似乎是一个坏主意
干杯!
答案 1 :(得分:0)
好的,差不多4年了,但是对于那些喜欢我的人来说,偶然发现了一个针对CakePHP应用程序的Acl解决方案;简短的回答是肯定的,但是必须仔细计划。如果你真的需要这个级别的Auth,那么Cake的ACL实现并没有真正可行的替代方案,这种方法至少是合理的(没有批评......)。注意当前稳定版本是2.4:
从本质上讲,解决方案是使用isOwner()
替换代码中的$dbAcl->check($user, $entity, $action);
调用,该调用会对ACL数据库结构进行查找 - 请参阅http://api.cakephp.org/2.4/class-DbAcl.html。
当然还有更多内容。 CakePHP不为您提供实体级别的此类身份验证的现成解决方案。它为您提供了一个可用于构建一个工具包的工具包:
dbAcl::check()
。见http://book.cakephp.org/2.0/en/core-libraries/components/authentication.html#authorization。如果您真的想要,也可以从自定义授权模块中执行此操作。请注意,关于ACL的Cake文档末尾有两个很好的教程 - http://book.cakephp.org/2.0/en/tutorials-and-examples。它们没有明确地涵盖这种类型的设置,但是如果理解所涵盖的概念加上dBAcl
,您应该能够以自己的方式。