登录用户可以访问其他用户的数据

时间:2012-03-27 19:52:14

标签: cakephp authorization cakephp-2.0

请耐心等待我,因为我是编程/ cakephp菜鸟,但我不知道如何限制用户访问其他用户数据。当用户登录时,他们会获得他们列表的仪表板(来自多个模型......餐馆,酒店,高尔夫球场,每个列表的图像,位置信息,优惠券等)。

根据型号/控制器的不同,我可以在浏览器栏/ restaurants / edit / 1中输入用户'3'(有酒店列表)类型,并编辑有餐馆ID'的用户'17'的餐厅信息= '1'。更糟糕的是,他们甚至可以访问/ users / dashboard / 17。如何限制用户仅访问自己的数据?我希望在AppController中可以使用某种'beforeAllow()'部分,我可以在AppController中预先检查用户ID,如果他们尝试对其他用户的数据执行CRUD操作,则将其踢回到他们的仪表板。

即使我使用的是ACL(我知道我应该但是在这个学习阶段坦率地说我的头脑太过分了),我仍然需要知道正确的代码来限制用户访问,对吗?

以下是我的AppController:

class AppController extends Controller {

 public $components = array(
    'Session',
    'Auth' => array(
        'loginRedirect' => array('controller' => 'users', 'action' => 'view'),
        'logoutRedirect' => array('controller' => 'docs', 'action' => 'index'),
        'authError' => 'Sorry, you are not authorized to view this page.'
    )
);


function beforeFilter() {



    $this->Auth->userModel = 'User'; 
    $this->Auth->allow('join_now','debug','index', 'condos', 'houses', 'hotels_and_motels', 'print_all_coupons', 'print_coupon', 'search', 'golf', 'charters', 'events', 'nightlife', 'shopping', 'visitors_info', 'contact_us', 'view', 'results');

}


}

这是一个示例编辑功能(来自我的UnitsController的编辑功能):

function edit($id) {
   $this->set('title', 'Edit your property');
   $this->Unit->id = $id;  

    if (empty($this->request->data)) {        
      $this->request->data = $this->Unit->read();    
} else { 

    if ($this->Unit->saveAll($this->request->data)) {  

        $this->Session->setFlash('Your property has been updated.', 'success'); 

    } 
}
}

我会说每个db表都有一个user_id字段,因此登录用户可以与每个模型的user_id匹配。

我认为this SO question是我正在寻找的东西,但他们最终开始切入正切,并且从未回答用户问的原始问题。

2 个答案:

答案 0 :(得分:1)

如果您使用cake acl和auth,那么不,您不必编写一堆代码,检查每个操作的用户ID,但是您必须编写代码以将acl绑定在一起。您告诉组件您的控制器和操作需要acl privelages。并且它不会在aros和acos表中查找,以确保请求内容的对象具有适当的权限。

我强烈建议您查看tutorial并了解如何让它发挥作用

如果你没有走那条路,那么你必须在每个加载相关内容的动作中添加检查。基本上你,当你请求一个动作时,你将使用该对象,然后获得与该对象相关联的用户,并检查用户的id是否与请求对象的id相同。

if ( $this->Unit->User->uid != $this->Session->User->uid ) {
    throw new NotFoundException('Could not find that Unit');
} else {
    ...
}

您可以做的另一件事,对于相同但自定义的网页,不使用网址/user/dashboard/17,而只是使用/user/dashboard然后在信息中心操作中,从中提取用户ID会话数据并加载经过身份验证的用户的配置文件

答案 1 :(得分:1)

我认为你需要使用CRUD授权来添加EditOwn动作。 CakePHP ACL Database Setup: ARO / ACO structure?中描述的答案处理了您需要的大部分逻辑。

请注意,解决方案仍未完成,您将可以访问可以呈现其他用户数据的操作。示例:脚手架'索引'方法。要在此限制对其他用户数据的访问,您可以修改查询以根据从Session获得的用户ID添加过滤器。