CakePHP:是否可以从控制器访问受保护的函数?

CakePHP:是否可以从控制器访问受保护的函数?,php,cakephp,Php,Cakephp,我在一个控制器中编写了两个操作,允许用户下载文件。程序如下: 用户进入某个控制器/导出数据,点击表单生成文本文件 操作export_data()然后为用户写入一个文本文件 一旦检测到已生成文件,将显示另一个按钮,供用户单击以通过媒体视图下载文件。此操作是some\u controller/download\u file 我的问题是,如何让用户手动无法访问某些控制器/下载文件?i、 e.我想阻止用户在浏览器中键入此URL并下载文件。我尝试设置受保护的函数\u download\u file(),但

我在一个控制器
中编写了两个操作,允许用户下载文件。程序如下:

  • 用户进入某个控制器/导出数据,点击表单生成文本文件
  • 操作
    export_data()
    然后为用户写入一个文本文件
  • 一旦检测到已生成文件,将显示另一个按钮,供用户单击以通过媒体视图下载文件。此操作是
    some\u controller/download\u file
  • 我的问题是,如何让用户手动无法访问
    某些控制器/下载文件?i、 e.我想阻止用户在浏览器中键入此URL并下载文件。我尝试设置
    受保护的函数\u download\u file()
    ,但这使视图无法访问
    某些控制器中的操作


    我觉得我走错了方向。有人想给我一些指导吗?

    当用户单击“生成文本文件”
    按钮时:

  • some_controller/export_data
    操作中设置一个会话变量

  • some_controller/download_file
    操作中,首先检查该会话变量

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

  • 若并没有,那个么现在就允许他下载这个文件

  • 通过这种方式,您可以分配
    一些\u控制器/下载\u文件
    公共
    访问权限


    如果用户直接访问某个\u控制器/下载\u文件操作
    ,则会话变量将不存在,并且他无法下载文件。

    该操作无法保护,因为用户单击下载按钮时需要它。你能做的最好的事情就是保护它,这是完全可以接受的。例如,您可以执行以下操作:

  • 在export_数据中,生成表示文件的随机键(即1234)
  • 当按钮出现时,url包含表示文件的键(即.../某个\u控制器/下载\u文件?键=1234)
  • 在download_文件中,检查密钥是否存在并表示已准备好下载的文件。如果密钥是好的,给他们文件,如果没有显示错误消息

  • 可能尝试
    private
    而不是
    protected
    ?让我知道这是否有效。在我看来,私密处无法通过请求访问。但是现在已经很晚了,我正在交叉眼睛。。。我之前尝试过
    private
    ,但是视图甚至无法识别操作的存在<代码>受保护
    给了我一个拒绝访问的错误。我需要在工作中使用的数据库目前处于脱机状态,所以我必须在周一再试一次。我会更新的。这看起来非常有效。我会记下session变量以用于其他目的!谢谢。我可以检查一下该文件(由
    下载文件
    中的模型视图生成)是否已由用户实际下载吗?谢谢您的输入。最后我使用了session变量,原则上与您的建议非常相似。谢谢