cakephp避免登录用户访问其他用户的帐户

时间:2011-03-31 21:10:15

标签: cakephp save authentication

我正在使用CakePHP 1.3.7开发一个网站。一切都很顺利,我喜欢它,但我刚遇到一个问题(可能是因为我缺乏知识),我无法弄清楚如何修复。

这是我的问题:

在网站上,有一个典型的“管理我的帐户”区域,用户只能在登录时访问。在此区域中,有一个链接可以调用同一个“用户”控制器中的操作“ edit_items'。因此,当用户转到 edit_items 时,该操作会将用户的 ID 作为参数接收(类似于domain.com/users/edit_items/45,其中45是用户的ID ),并以表格形式显示信息。如果我直接访问浏览器的地址栏并将其更改为任何其他用户的ID,则会出现问题,即使该用户未登录,也会显示该其他用户的信息。这显然是一个很大的安全性问题。

我一直试图避免将用户的id作为参数传递,并使用 $ this-> Auth-> User('id')从Auth组件(我正在使用)中获取它即可。无论出于何种原因,我可以将已记录用户的信息读入表单中,但是当我尝试在表单上保存更改时,我收到错误,好像保存操作失败了,我有不知道为什么。

还有其他方法可以避免我的问题吗?或者弄清楚为什么保存会返回错误?

谢谢!

修改

问题来自验证,这是交易:当用户填写表单以创建新项目时,存在某些字段,其中一些字段应用了验证规则。但是,当用户返回编辑项目时,并非所有字段都可编辑,只有一些字段可编辑。是否有可能因为某些在创建项目时需要验证的字段在编辑时不可用,导致错误?怎么可以避免呢?我是否可以仅针对修改操作更改验证规则?

正在发生的事情的示例:创建项目时,其中一个字段是 item_name ,其中已应用了一些验证。编辑项目时,其名称无法更改,因此未在编辑表单中显示。我相信这可能导致错误,可能是因为缺少 item_name

1 个答案:

答案 0 :(得分:0)

您开启了正确的方向 - 当用户需要编辑自己的详细信息时,在网址上传递user_id是一个坏主意。

您可以使用以下内容:在实际保存之前保存表单时,可以将user_id传递给发布的数据。像这样:

if (!empty($this->data)) {
   $this->data['User']['id'] = $this->Auth->user('id');
   ... //Some extra stuff
   if ($this->User->save($this->data)) {
      ... //success
   } else {
      ... //error
   }
}

这样,记录的用户将始终覆盖它自己的记录。检查模型中是否有一些验证规则可以解决此错误。