2015-09-11 53 views
1

我有一個用金字塔/ cornice編寫的RESTful API。它爲Ember客戶端提供了一個API。使用檐口的簡單身份驗證和ACL

我跟着cornice tutorial,並有一個valid_token驗證器,我在許多視圖上用作資源類的方法。

def valid_token(request): 
    header = 'Authorization' 
    token = request.headers.get(header) 
    if token is None: 
     request.errors.add('headers', header, "Missing token") 
     request.errors.status = 401 
     return 
    session = DBSession.query(Session).get(token) 
    if not session: 
     request.errors.add('headers', header, "invalid token") 
     request.errors.status = 401 
    request.validated['session'] = session 

現在我想開始有選擇地保護資源。 The Pyramid way似乎是註冊認證/授權策略。 ACLAuthorizationPolicy似乎提供了對金字塔中漂亮的ACL工具的訪問。但是,似乎金字塔需要身份驗證和授權策略才能發揮作用。由於我使用驗證器進行驗證,所以令我困惑。

我可以使用ACL來控制授權,同時使用我的檐口驗證valid_token驗證程序嗎?我是否需要註冊金字塔認證或授權策略?

我有點困惑,幾乎沒有在金字塔中使用ACL的經驗。

回答

1

這不是一個簡單的問題:)

不久:

  • 您在驗證實現哪些功能已經由金字塔與AuthenticationPolicy
  • 開始照顧設定了一個SessionAuthenticationPolicy您自定義回調(see code
  • 一旦這authn設置,您將有那些401響應,並且您的session值在request.authenticated_userid屬性中。您還可以在request.registry對象中自定義內容。

的唯一理由,讓您的驗證是,如果你想在401響應返回invalid token消息。但對於這一點,你可以當你有,你可以設置你的看法自定義授權定義自定義401金字塔視圖(使用@forbidden_view_config

。你可以在Cliquet的第一個版本中找到一個非常簡單的例子:authz codeview perm

祝你好運!

+0

所以你的建議是避免使用檐口驗證器進行身份驗證? –

+0

我正在努力。看起來我需要推出我自己的AuthenticationPolicy,SessionAuthenticationPolicy似乎不適合於在每個請求上進行授權時。 –

0

你可能想要做這樣的事情:

from pyramid.authentication import SessionAuthenticationPolicy 
from pyramid.authorization import ACLAuthorizationPolicy 
from your_module import valid_token 

authn_policy = SessionAuthenticationPolicy(debug=True, callback=valid_token) 
authz_policy = ACLAuthorizationPolicy() 

config = Configurator(authentication_policy=authn_policy,authorization_policy=authz_policy) 

而且ofcourse在配置將收到其他參數,像settigns,locale_negociator,...........

希望這將幫助