2014-05-19 273 views
0

我有一個GAE應用程序,用於在調用任何網頁之前檢查管理員是否已登錄。我已經嘗試過各種方法來管理登錄過程。用戶身份驗證最佳實踐

Q1 - 我在做例子二中的裝飾器時會出現什麼問題?
Q2 - 有人通常會檢查函數嗎?

在每個get函數中使用if語句之前。問題在於,如果在每個函數中反覆使用語句,我都會重複此操作。

class IncomePage(webapp2.RequestHandler): 
    def get(self): 
    if users.is_current_user_admin(): 
     self.response.write('My Webpage') 
    else: 
     self.response.write('Please Login') 

然後我試着讓一個裝飾者爲我做。它沒有工作,所以我做錯了什麼。

def check(func): 
    if users.is_current_user_admin(): 
    return func 
    else: 
    response.write('Please Login') ### Doesn't work 

class IncomePage(webapp2.RequestHandler): 
    @check 
    def get(self): 
     self.response.write('My Webpage') 

回答

5

這不是一個裝飾者。裝飾器需要返回一個被調用來代替實際函數的包裝器函數,它是需要做測試然後調用原件的包裝器。

def check(func): 
    def wrapper(*args, **kwargs): 
    if users.is_current_user_admin(): 
     return func(*args, **kwargs) 
    else: 
     response.write('Please Login') 
    return wrapper 
+0

謝謝,但該回復於不工作要麼。 –

+0

您將無法訪問修飾器中當時的回覆。 'args'中的第一個參數將會是'self',所以你需要把它拉出來並且從中調用響應。它可能看起來像'args [0] .response。寫()' –

+0

我最後一個問題,我需要使用我的職位功能? –

4

如果處理程序的所有用戶都必須登錄並admin,那麼你就可以在app.yaml中,而不是在你的代碼中指定的限制。

https://developers.google.com/appengine/docs/python/config/appconfig#Python_app_yaml_Requiring_login_or_administrator_status

而且會看起來像

- url: /admin/.* 
    script: somefile.application 
    login: admin 

請務必閱讀文檔完全不只是走馬觀花。很顯然,你有一些額外的選項

auth_fail_action

介紹所採取的行動時,登錄存在且用戶不 登錄有兩個可能的值:

重定向(默認)。用戶將被重定向到Google登錄頁面 頁面,或者如果使用OpenID身份驗證,則會將其重定向到/ _ah/login_required。 用戶在登錄後重定向迴應用程序URL或 創建一個帳戶。未經授權。該請求被 HTTP狀態碼401和錯誤消息拒絕。

進一步在文檔中,您將看到示例。

+0

我試過這個,但無法弄清楚如何將用戶重定向到登錄頁面,例如「請登錄」。 –

+0

請看我上面編輯 –

+0

謝謝,但我會如何將用戶重定向到我自己的自定義錯誤頁面。我試圖使用Webapp2錯誤處理程序,但無法讓他們爲錯誤401工作,也沒有得到它重定向到我自己的網址。 –

相關問題