2014-10-02 15 views
1

我的web應用程序使用Amazon S3將所有媒體文件存儲在我的djagno web應用程序中,並通過django-storages第三方應用程序的幫助。將s3文件限制爲Django組用戶

我的db處理文件夾和文件的層次結構,每個用戶只看到屬於他的組的鏈接。

但是! S3中的其他文件夾沒有權限。

例如: 用戶1:組1組 用戶2:組第2組 S3鏈接:https://s3.amazonaws.com/ /media/group1/folder1/1.png

用戶1會看到這個在他的內頁應用程序。 用戶2不會看到這個鏈接,但是如果他試圖訪問這個鏈接,那麼這個文件就沒有權限,並且它很容易下載。

我的目標是限制每個組的文件夾權限。

有自動的解決方案,基於我的aws密鑰? 我迷路了...

回答

1

編輯新的解決方案:

亞馬遜SDK提供了預簽名URL特性。 使用此功能,您只能爲用戶生成一個特定文件的臨時網址。

所以用例場景就是這樣。 S3圖像保持私密狀態。 當用戶請求他的圖像時,您首先將所有鏈接傳遞給生成臨時鏈接的簽名處理程序。 (這些設置會過期並且有很多加密和保護,所以有人不可能劫持這樣的鏈接)。

最終用戶可以直接從amazon的瀏覽器中加載和查看文件,就像沒有任何事情發生一樣。

老辦法

那麼另一個解決辦法可能是在S3中所有文件存儲,而不公共訪問。 然後爲您的應用程序創建一個IAM角色並將該角色訪問存儲桶。 然後創建一個方法,它將讀取應用程序中的S3文件,並在用戶擁有權限時將其提供給用戶。

簡單的例子。

S3文件路徑

//media/group1/folder1/1.png

請求= MyWebMethod /的GetFile?internalPath =「文件夾1/1。PNG」

{

詮釋用戶id = customAuthentication.getUserId();

字符串CompletePath = 「媒體/組」 +用戶id + 「/」 + internalPath

變種圖像= AwdSdkClient.getFileFromS3( CompletePath);

返回的圖像;

}

因此默認情況下,每個用戶只能在他的組內請求文件。

更高級的方法,不是將文件實際提取到您的服務器,而是創建一些中間數據流管道到文件。 (我不是Django的開發者,所以我不知道這是否可行)

0

您正在尋找爲您的網絡認證用戶有效提供單點登錄。一種方式,或許是解決這個問題的唯一方法,就是通過使用SAML provider。這樣做,您會將您的第三方認證用戶/組映射到AWS IAM用戶/組。

它會工作,但它需要的不僅僅是點擊幾下鼠標。