我很擅长使用CakePHP,但我已经发现它对于快速开发网络应用程序非常有用。
但是,我想知道是否有办法以非标准方式限制对某些对象的访问。例如,如果我要创建单个CMS系统允许用户创建“站点”,我如何断言用户(多个)可以访问该特定站点?
我可以在我的站点控制器中检查这个但是我需要为我站点上的每个控制器检查一次 - 例如,我需要检查正在编辑的当前页面,新闻,联系人,文件等是否属于网站ID和用户有权编辑它吗?
即thecms.com/pages/edit/123(我怎样才能确定用户9可以编辑属于网站2的第123页)
我认为这超出了ACL可以提供的范围,因为它们是特定于实体的。有没有简单的方法呢?
答案 0 :(得分:5)
我假设您已经了解CakePHP的Auth和ACL组件,它们可以提供限制内容的方法。但你说的也是如此:CakePHP的ACL是“特定于实体”的,而不是“每个记录”的最佳选择(例如,用户3不应该访问第7条)。所以我提出这个代码;尝试一下,让我知道:
在app / app_controller.php文件中:
<?php
class AppController extends Controller {
function checkPermission($aro, $aco, $loggedUserRole = 'User') {
if ($loggedUserRole != 'Admin') {
$permission = ($aro == $aco);
if (!$permission) {
$this->Session->setFlash('You cannot access that.');
$this->redirect('/somewhere');
}
}
}
}
然后,在您要限制的操作中,输入:
$this->checkPermission($this->Auth->user('id'), $someId, $this->Auth->user('role'));
因此,checkPermission()函数执行以下操作:
调用时,您传递要授权的用户的ID,用户尝试访问的内容的ID以及角色(因此假设在其中有一个“角色”列users表;另外,$this->Auth->user('id')
表示Auth组件自动存储的用户会话数据。然后checkPermission()方法检查传递的角色是否不是管理员(假设将有管理员可以访问所有人),然后检查$ aro和$ aco参数的相等性。如果没有,那么它会在某处重定向,并显示“禁止”消息。
现在,$ aco参数可以是各种各样的东西。例如,假设您正在创建一个用于编辑用户帐户的函数,该函数使用$ userId参数。因此,您将登录用户的ID(来自$this->Auth->user('id')
)与传递的$ userId进行比较。如果不相等,则表示登录用户不应该编辑该用户记录。
另一个例子:
您有一个删除文章的操作,该文章接受$ articleId参数。您可以从数据库中获取文章,然后在删除文章之前将文章的user_id
值作为$ aco,传递。同样,如果user_id
不是他,则登录用户将被踢出。
我希望这个解决方案能为您提供良好的服务。