2015-02-26 159 views
2

我已經收到加入HTTP認證(BasicAuthAuthenticationPolicy)到已經有AuthTktAuthenticationPolicy實施的金字塔應用程序的任務...多Authhentication政策

基本上我需要創建一個RESTful API來驗證用戶身份(莫非我使用BasicAuthAuthenticationPolicy?)。

有沒有辦法來檢查用戶是使用Web界面還是使用API​​ - 檢查使用哪種認證策略?

我還沒有遇到過涵蓋單個金字塔應用程序中兩種不同身份驗證策略的文檔(如果它甚至可能的話)。

PS:
我遇到了一個博客系列,開始展示如何用金字塔框架創建一個RESTful API ... Blogger報告說,在sersies中將會有6篇文章,但是我只管理找到其中兩篇文章:Building a RESTful API with Pyramid - SetupBuilding a RESTful API with Pyramid - Resource and Traversal。我很期待他的最後一篇文章:使用金字塔 - 身份驗證和ACL構建RESTful API,但似乎他不打算完成該系列。

總結一下我的問題:

  1. 我可以用BasicAuthAuthenticationPolicy構建一個RESTful API來驗證用戶身份?
  2. 是否有方法檢查用戶是使用Web界面還是使用API​​ - 檢查使用哪種認證策略?

任何幫助將被讚賞。

回答

1

所以我做了什麼是我合併金字塔BasicAuthAuthenticationPolicyCallbackAuthenticationPolicy和我結束了this

我已經修改了callback方法使用redis會議

要使用這個類(HTTPAthentication),你可以這樣做(這是一個例子,我如何實現它爲我的用例):

def _get_userid(details, request): 
    userre = re.compile("""^([a-zA-Z1-9\.]+):([a-zA-Z1-9\.:-]+)$""", re.I) 
    userpass = base64.b64decode(details[1]) 
    res = userre.search(userpass) 
    if res: 
     return res.group()[0] 

def authcheck(username, password, request): 
    user = Users.by_username(username, enabled=True) 
    host = request.registry.settings.get("authentication.host", "127.0.0.1") 
    maxattempts = request.registry.settings.get("authentication.maxattempts",5) 
    base = _get_userid(request.authorization, request) 
    if request.redis.exists("pimssess:%s" % base64.b64encode(request.remote_addr+":"+base)): 
     store = pickle.loads(request.redis.get("pimssess:%s" % base64.b64encode(request.remote_addr+":"+base))) 
     if store.get("auth.attempts").get(request.remote_addr): 
      if store["auth.attempts"][request.remote_addr] >= maxattempts: 
       raise HTTPMethodNotAllowed(body="You have been locked out for 5 minutes") 

    if user and user.agent and not user.is_http_auth: 
     raise HTTPMethodNotAllowed(body="You are not permitted http access") 
    if user and user.agent and user.host != host: 
     raise HTTPMethodNotAllowed(body="Your host is not permitted http access") 
    if user and user.agent and not user.validate_password(password): 
     time.sleep(1.5) 
     raise HTTPForbidden(body="Failed login, Incorrect password") 
    return getGroups(username) 

getGroups函數重新生成一個連接到用戶的列表groups,即['admin', 'reporting']

我跟着這個例子:BasicAuthAuthenticationPolicy(滾動到底)

以及Web界面登錄(CallbackAuthentication),您創建一個登錄界面,並創建以適應模板中的視圖(檢查用戶名和密碼比賽等)

哦,我差點忘了...在你的項目__init__.py,當你撥打AuthPolicy,在def main(...)。我做了:

authentication = AuthPolicy(secret='@#^&*$!DSYUIDSA8321789DS', 
         hashalg='sha512', check=authcheck, debug=True) 
authorization = ACLAuthorizationPolicy() 

config = Configurator(settings=settings, root_factory=RootFactory, 
        authentication_policy=authentication, 
        authorization_policy=authorization) 

我確實希望這可以幫助某人。

1

金字塔不容易使用不同的政策爲應用程序的不同部分(也許東西要與自定義裝飾工作),但多個政策檢查出pyramid_authstack。我將它與Session和BasicAuth策略一起用於與您相同的目的。

1

如果不是直截了當地有一個金字塔應用程序和兩個授權策略,你可以有兩個單獨的金字塔應用程序和一個不同的策略,每個程序集合成一個WSGI堆棧。每個應用程序都可以導入相同的Python代碼,因此,實質上,它將是兩個使用相同視圖和所有內容的啓動文件。

如果你的應用程序有不同的URL,你可以使用paste.urlmap,如果你的需求比較複雜,你甚至可以編寫你自己的路由器(比如說,帶有某個HTTP頭的請求被路由到一個應用程序, )