Jam*_*man 5 php authentication cakephp
我是使用CakePHP的新手,但我已经发现我对快速开发Web应用程序非常有用.
但是,我想知道是否有办法以非标准方式限制对某些对象的访问.例如,如果我要创建单个CMS系统允许用户创建"站点",我如何断言用户(多个)可以访问该特定站点?
我可以在我的站点控制器中检查这个,但是我需要为我站点上的每个控制器检查一次 - 例如,我需要检查正在编辑的当前页面,新闻,联系人,文件等是否属于站点ID和用户有权编辑它吗?
即,thecms.com/pages/edit/123(我如何确定用户9可以编辑属于站点2的第123页)
我假设这超出了ACL可以提供的范围,因为它们是特定于实体的.有没有简单的方法来做到这一点?
我假设您已经了解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');
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,在您要限制的操作中,放置:
$this->checkPermission($this->Auth->user('id'), $someId, $this->Auth->user('role'));
Run Code Online (Sandbox Code Playgroud)
因此,checkPermission()函数执行以下操作:
调用时,您为要授权的用户传递一个id,用户尝试访问的东西的id,以及一个角色(因此假设users表中有一列'Role';另外,$this->Auth->user('id')表示由Auth组件自动存储的用户会话数据).然后checkPermission()方法检查传递的角色是否不是管理员(假设将有管理员可以访问所有人),然后检查$ aro和$ aco参数的相等性.如果没有,那么它会在某处重定向并显示"禁止"消息.
现在,$ aco参数可以是各种各样的东西.例如,假设您正在创建一个用于编辑用户帐户的函数,该函数使用$ userId参数.因此,您将登录用户的ID(来自$this->Auth->user('id'))与传递的$ userId进行比较.如果不相等,则表示登录用户不应该编辑该用户记录.
另一个例子:你有一个删除文章的动作,它接受$ articleId参数.您可以从数据库中获取文章,然后在删除文章之前将文章的user_id值作为$ aco 传递.再次,登录用户将被踢出,如果这不是他.user_id
我希望这个解决方案对你有好处.