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

问题描述:

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

根据模型/控制器的不同,我可以在浏览器栏/餐厅/编辑/ 1中设置用户'3'(有酒店列表)类型,并编辑用户'17'的餐厅信息ID = '1'。更糟糕的是,他们甚至可以访问/ users/dashboard/17。如何限制用户只能访问他们自己的数据?我希望在AppController中可以使用某种'beforeAllow()'部分,它可以事先检查用户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'); 

    } 
} 
} 

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

我认为this SO question是我正在寻找的,但他们最终得到了一个切线,并从未回答用户提出的原始问题。

如果你在哪里使用cakes acl和auth,那么不需要编写一堆代码,检查每个动作的用户id,但是你必须编写代码来将acl的代码。您会告诉Component您的控制器和操作需要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 { 
    ... 
} 

你能做到,对于是相同的,但自定义页面的另一件事,是不是使用url /user/dashboard/17,而是只使用/user/dashboard然后在仪表盘的动作,从会话中提取数据的用户ID和加载已验证用户的配置文件

+0

我知道我会得到几个“不,认真使用ACL组件”的答案,嘿嘿。 (插入另一个'蛋糕手册是可怕的'评论)老实说,我可以与它,我只是不知道如何基于登录的用户ID扼杀行动,你上面的代码几乎是我一直在寻找。谢谢! – huzzah 2012-03-28 15:41:36

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

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