2013-02-09 50 views
2

我在控制器some_controller中写了两个动作,允许一个人下载文件。程序如下:CakePHP:是否可以从控制器访问受保护的功能?

  1. 用户转到some_controller/export_data并单击表单生成文本文件。
  2. 然后动作export_data()为用户写入一个文本文件。
  3. 一旦检测到文件已经生成,另一个按钮会出现,用户点击以通过媒体视图下载文件。此操作是some_controller/download_file

我的问题是,我该如何使some_controller/download_file用户无法手动访问?即我想阻止用户将该URL输入浏览器并下载文件。我尝试设置protected function _download_file(),但这会使视图无法访问some_controller中的操作。

我觉得我正在接近这个错误的方式。有人想给我一些方向?

+0

也许尝试'私人'而不是'保护'?让我知道如果这样的作品.. – asifrc 2013-02-09 01:04:51

+1

在我看来像私人无法通过请求访问。但是很晚了,我穿过了眼睛... https://github.com/cakephp/cakephp/blob/master/lib/Cake/Controller/Controller.php#L466-L497 – Daniel 2013-02-09 01:07:40

+0

我之前尝试过'private',但那么这个观点甚至不会意识到存在的行动。 'protected'给了我一个访问被拒绝的错误。我需要在工作中使用的数据库目前处于离线状态,因此我必须在星期一再试一次。我会更新。 – musicliftsme 2013-02-09 01:08:27

回答

2

当用户点击按钮generate a text file

  1. some_controller/export_data动作设置会话变量

  2. some_controller/download_file操作检查会话变量第一。

  3. 如果已设置,则允许用户下载文件并销毁会话。

  4. 如果不是,那么现在就允许他下载文件。

通过这种方式,您可以分配some_controller/download_filepublic访问权限。

如果用户直接访问some_controller/download_file action,那么会话变量将不存在,并且他无法下载该文件。

+0

这似乎工作得很好。我会注意到会话变量用于其他目的!谢谢。 – musicliftsme 2013-02-11 17:13:46

+0

我有可能检查文件(由'download_file'中的模型视图生成)是否已被用户实际下载? – musicliftsme 2013-02-11 18:01:11

1

该操作无法受到保护,因为您在用户单击下载按钮时需要该操作。你可以做的最好的就是守卫它,这是完全可以接受的。例如,你可以做到以下几点:

  1. 在export_data随机生成一个密钥(即1234),表示该文件
  2. 当按钮出现,该URL包含表示该文件(即重点../ some_controller/download_file?key = 1234)
  3. 在download_file中,检查该密钥是否存在,并表示可供下载的文件。如果关键是好的,给他们的文件,如果它没有显示错误信息。
+0

感谢您的输入。我结束了与会议变量,这原则上是非常类似于你的建议。谢谢! – musicliftsme 2013-02-11 17:14:51