[英]Mixing Authentication Policies in Pyramid
我正在編寫一個具有一些HTML內容(顯示表等)並且還具有JSON API的應用程序。
對於普通的HTML,我使用AuthTktAuthenticationPolicy
進行身份驗證,並使用ACLAuthorizationPolicy
進行授權。 因此,向用戶顯示一個登錄表單,並在成功登錄auth_tkt
設置auth_tkt
cookie。 系統工作正常。
現在,我想為JSON API復制一個類似的系統。 問題在於,對於API請求,用戶不一定要登錄。因此,每個請求都需要一個api_key
參數。 根據密鑰,如果我找到一個有效的用戶,我將發送回JSON。 其他我顯示403頁。
一種方法是在每個視圖中執行此操作
api_key = request.GET.get('api_key',None)
user = FrontEndUsers.User_by_api_key(api_key)
if user:
#Process view
else:
return HTTPForbidden
但是,似乎每個視圖都無法使用樣板程序來完成身份驗證策略將要執行的操作。 我可以為JSON路由指定單獨的身份驗證策略嗎? 還是有其他方法可以做到這一點?
編輯
再次考慮,似乎即使使用AuthTktAuthenticationPolicy
,我也必須在每個視圖中執行security.authenticated_userid()
(如果我需要身份驗證信息)。 我已經將其分解為一個單獨的功能
def get_auth_info():
user_id = security.authenticated_userid()
login_info = {}
if user_id is not None:
login_info['login'] = True
login_info['logged_in_user'] = FrontendUsers.get_user_by_id(user_id).name
else:
login_info['login'] = False
return login_info
我可以在此函數中包括API_key check函數調用,這樣我的視圖都不會改變(我仍然只調用get_auth_info()
),但是我可以檢查是否提供了正確的API密鑰。
我仍然想看看是否有其他方法可以執行此操作,或者我當前的方案是否存在問題
您在這里的任何地方都沒有提到權限的使用方式? 在視圖上正確使用權限和ACL應該可以防止您在功能開始時運行該樣板。 對於您顯示的簡單粘貼,您只需要一個permission='logged_in'
和一個ACE映射(Allow, Authenticated, 'logged_in')
,但是當然,如果需要,您可以變得更加復雜。
由於金字塔中的身份驗證策略旨在全局,因此無法以簡單的方式為不同的視圖指定不同的身份驗證策略。 您可以通過pyramid_multiauth在全球范圍內進行操作。 或者,您可以編寫自己的策略,該策略包裝多個策略並根據請求屬性分派給一個或另一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.