请耐心等待我,因为我是编程/ 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是我正在寻找的东西,但他们最终开始切入正切,并且从未回答用户问的原始问题。
答案 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添加过滤器。