2013-09-24 43 views
0

我們正在運行CakePHP 2.3 ...CakePHP:如何控制對可下載文件的訪問

我們需要控制對PDF文件的訪問。例如,我們需要用戶能夠查看/下載他們自己的PDF,而不是其他的。管理員可以查看全部。等等

第一個問題是這些文件應該存在於CakePHP的目錄結構中。

我們嘗試用/根目錄/文件/ ...但現在看來,這些都是公開訪問的(即,任何人都可以直接導航到任何文件,如果他們知道的完整路徑:www.example.com/files/private.pdf

一旦文件被存儲在安全的位置,第二個問題是處理授權的最佳方式是什麼,以便正確的用戶可以訪問正確的文件。

感覺像CakePHP有一些內置的支持,但我們無法找到它的文檔

回答

1

您需要在文件夾中添加一個.htaccess文件無論你在哪裏保留你的PDF,都不能通過正常的方式訪問它們。 deny direct access to a folder and file by htaccess它並不特別關心你把pdf放在哪裏,儘管我推薦你的webroot文件夾中的某個地方以及它們自己的文件夾中。

然後,你需要在你的控制器中添加一個函數來顯示pdf,而不是僅僅鏈接到它。在CakePHP < 2.3中,您可以使用mediaview類來完成此操作。 http://book.cakephp.org/2.0/en/views/media-view.html在更新版本的CakePHP中,它是通過發送文件。 http://book.cakephp.org/2.0/en/controllers/request-response.html#cake-response-file

+0

謝謝。你能否談一談Cake的發送文件如何與.htaccess規則交互?我們是否需要允許(Cake)PHP使用PDF訪問目錄的特定異常? – emersonthis

+0

.htaccess應該阻止人們直接在互聯網上查看pdf,但CakePHP將訪問文件而不通過互聯網(通過瀏覽文件系統),因此.htaccess規則不適用於它。然後,用戶將轉到由控制器定義的url,並決定將您的視圖pdf函數放在哪個操作中,這將成爲與pdf實際位置完全不同的位置。 – Kai

+0

啊。我懂了。控制器引用路徑而不是文件的URL(這是.htaccess關心的)。這就說得通了。但是,如果是這樣的話,爲什麼把它放在webroot中呢? – emersonthis

1

不要把你的文件不要希望公衆可在webroot。沒有.htaccess修改需要然後。

要通過php將文件發送到客戶端,有media viewrequest object。你將使用什麼取決於你的CakePHP版本。

無論您正在使用的身份驗證適配器將應用於FilesController :: download()方法,還是適用於您的方法和控制器都被命名的方法。

+2

你的意思是「不要把你不想公開的文件放在webroot中」? – emersonthis

+0

呃......是的!更正它。 – burzum