2013-02-09 29 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