2017-02-26 55 views
0

我有以下問題: 我在Django寫了一個應用程序,基本上它是我的合唱團的某種管理平臺。現在我們有一些我們想要提供給我們會員的文件,但只有他們(即註冊用戶)。此外,還有一些文件只能由管理人員訪問。理想情況下,我希望能夠在數據庫中定義誰可以訪問哪些文件。對Django應用程序的Apache身份驗證

這裏是關於環境的一些信息:

  • 服務器操作系統的Debian 8.7
  • Python版本2.7
  • Django的版本1.10
  • mod_wsgi的4.3版本

我有什麼企圖至今?

Django documentation提供了一個非常非常小的如何對數據庫進行身份驗證的示例。

我只驗證用戶是否是有效用戶的部分有效。儘管它很糟糕,但用戶每次訪問文件時都必須重新登錄。

我驗證用戶是否爲組的部分完全不起作用。 Apache說:

Unknown Authz provider: group 

然後我開始看這個問題,這導致我here。當我使用選項wsgi-group時,apache配置不會導致任何問題,但它顯然不驗證用戶是否在指定的組中。 (我試圖訪問與誰不是指定的組中,併成功用戶文件...)

現在,這裏有一些問題,我有這個問題:

  1. 有其他人遇到這些問題與需求組/需求wsgi-group選項,並找到了解決方案?
  2. 是否有可能將網站的會話與apache文件訪問的會話「鏈接」?正如我已經提到的,如果用戶每次訪問文件時都需要重新登錄,用戶界面不太友好。
  3. 是否有可能編寫自定義身份驗證功能?從技術上看,在authentication method check_password(此處爲「auth.wsgi」)的示例實現中,我可以覆蓋此函數,前提是變量包含用戶想要訪問的URL。 (是嗎?)
  4. 這可能是最動態的解決方案,但我不知道這是否可能。基本思想是,我在視圖中爲每個可下載文件呈現一個按鈕,並將POST發送到服務器。服務器檢查會話用戶是否有權訪問該文件,如果爲true,則返回文件。這意味着文件只能被應用程序訪問,而不能通過Apache訪問。這可能嗎?

我希望有人能幫幫我,謝謝你提前反正=)

編輯:我做了一些研究,發現了我在這裏的最後一個問題(Having Django serve downloadable files)的答案。有了mod_xsendfile,這顯然很容易管理。這隻剩下3個問題;)

回答

0

我還在我的Django應用程序(通常用於提供存儲在FileFields中的文件)中使用X-Send,但用於託管一套靜態頁面,如sphinx生成的頁面和支持媒體,通過X-Send進行代理使我陷入了比解決方案更多的問題。

由於我是研究my own question我發現你和意識到,我的是解決你的問題#1和#2:使用的mod_wsgi的WSGIAccessScript配置與allow_access(ENVIRON,主機)函數來實例化一個Django WSGI請求其可以使用您需要的任何業務邏輯以編程方式蒸餾爲布爾值。我希望別人能回答我對這種方法更具體的關注,但它是有用的。

你的問題#3建議我指向Django's Custom Authentication Backend documentation。我編寫了一個自定義後端,它使用電子郵件地址對用戶進行身份驗證,而不是要求用戶記住任意用戶名。

#Django Imports 
from django.conf import settings 
from django.contrib.auth.models import User 

class EmailAuthBackend(object): 
    """ 
    Email Authentication Backend 

    Allows a user to sign in using an email/password pair rather than 
    a username/password pair. 
    """ 

    def authenticate(self, username=None, password=None): 
     """ Authenticate a user based on email address as the user name. """ 
     try: 
      user = User.objects.get(email__iexact=username) 
      if user.check_password(password): 
       return user 
     except User.DoesNotExist: 
      return None 

    def get_user(self, user_id): 
     """ Get a User object from the user_id. """ 
     try: 
      return User.objects.get(pk=user_id) 
     except User.DoesNotExist: 
      return None 
相關問題