2009-07-19 35 views
1

我正在設計一個網站。它處於非常早期階段,我必須決定是否使用服務器提供的SingleSignOn服務。 (這是一個校園網站,越來越多的網站在這裏使用SSO,所以通常這是一個好主意)。 目標平臺很可能將通過mod_wsgi作爲django。但是,隨服務提供的任何文檔都具有php代碼。此方法嚴重依賴於使用自定義$_SERVER['HTTPsomething']變量。不幸的是,現在我無法訪問這個環境。

(How)我可以在django中訪問這些自定義變量嗎?根據WSGI文檔,environ變量應該包含儘可能多的變量。我可以確定我可以訪問它們嗎?

回答

5

在Django中,服務器環境變量設置爲request對象的META屬性的字典成員 - 所以在你看來,你可以隨時通過request.META['foo']訪問它們其中foo是變量的名稱。

查看可用內容的簡單方法是創建包含assert False的視圖以觸發錯誤。只要您使用DEBUG=True即可運行,您將看到一個不錯的錯誤頁面,其中包含大量關於服務器狀態的信息,包括所有request屬性的完整列表。

0

那麼,$ _SERVER是PHP。你很可能也可以通過WSGI訪問相同的變量,但要確定你需要弄清楚SSO是如何工作的,所以你知道什麼創建了這些變量(可能是Apache)並且你可以訪問它們。

或者,你可以讓自己進入並嘗試一下。 :)

3

要確定在原始WSGI環境中傳遞的變量集合,在Django對它們做任何事情之前,將下面的代碼放入WSGI腳本文件中以代替Django的東西。

import StringIO 

def application(environ, start_response): 
    headers = [] 
    headers.append(('Content-type', 'text/plain')) 

    start_response('200 OK', headers) 

    input = environ['wsgi.input'] 
    output = StringIO.StringIO() 

    keys = environ.keys() 
    keys.sort() 
    for key in keys: 
     print >> output, '%s: %s' % (key, repr(environ[key])) 
    print >> output 

    length = int(environ.get('CONTENT_LENGTH', '0')) 
    output.write(input.read(length)) 

    return [output.getvalue()] 

它會向瀏覽器顯示一組鍵/值對。

瞭解SSO機制如何工作很重要。如果它明智之舉,您可能會發現它設置了REMOTE_USER和可能的AUTH_TYPE變量。如果設置了REMOTE_USER,則表示在變量中命名的用戶已通過Apache中的某個更高級別的身份驗證機制進行身份驗證。這些變量通常是爲HTTP Basic和摘要式身份驗證設置的,但要使用盡可能多的系統,SSO機制也應該使用它們。

如果將它們設定,然後有一個Django的功能,在描述:

http://docs.djangoproject.com/en/dev/howto/auth-remote-user/

然後可以使用具有Django的接受在更高層次上進行身份驗證。

即使SSO機制不使用REMOTE_USER,而是使用自定義標頭,也可以在整個Django應用程序周圍使用自定義WSGI包裝來將任何自定義標頭轉換爲合適的REMOTE_USER值,然後Django可以使用它。

+0

謝謝,這是非常豐富的。 – 2009-07-20 00:33:12