2014-07-06 40 views
1

我有一個標準的金字塔應用程序。在主要方法__init__.py中,我有一個config.add_request_method(AuthHelper.get_user, 'user', reify=True)來設置全局可訪問的用戶對象。如何在同一個應用程序中有兩個登錄/身份驗證策略?

我將所有用戶存儲在user表中,我通過self.request.user訪問當前登錄的用戶。我的問題是,我想創建一個管理員門戶網站,從應用程序的其它部分完全分開的,我想那些「管理員」將被存儲在一個名爲admin表。這些管理員不是用戶 - 他們有一個單獨的登錄頁面,應該與用戶表沒有關係。

我有麻煩了管理員設置授權。例如,在remember(self.request, admin.id, max_age=...中,就身份驗證過程而言,無法區分成功登錄的用戶與成功登錄的管理員。一個User.id = 1可以訪問管理員門戶的Admin.id == 1,即使他們在登錄時不同的看法不同的憑據。

我想過在remember方法中使用Admin.username,但它仍然與config.add_request_method(AuthHelper.get_user...)(理解如此)衝突,這需要User.id

我怎樣才能建立一個授權策略,例如,如果您是從管理門戶登錄成功登錄,您的授權是誰從主索引頁面登錄,反之亦然普通用戶分開?

我覺得這是一個比較基本的需求,所以我必須失去了一個簡單的方法來實現這一點。謝謝。

回答

3

對於「管理門戶網站,從應用程序的其餘部分完全獨立」其中一個方案是設立一個獨立的應用程序WSGI,這將有一個單獨的request對象,認證規則等

然後你就可以用WSGI "composite"讓你的「正常」的應用程序被安裝在/和你的管理是,比如說,/admin組裝兩個應用程序一起。

您仍然可以從管理應用程序導入相同的代碼(模型和視圖) - 基本上這是添加另一個「啓動」文件(包含return config.make_wsgi_app()的文件)和配置.ini文件的問題。

如果您在管理應用程序更改cookie的名字,你會更能夠登錄在你的「主」的應用程序用戶,併爲您的「管理門戶」的管理:

authn_policy = AuthTktAuthenticationPolicy(
    ... 
    cookie_name='admin_auth_tkt', 
    ...) 
authz_policy = ACLAuthorizationPolicy() 
config.set_authentication_policy(authn_policy) 
config.set_authorization_policy(authz_policy) 

你需要在你的setup.py文件中定義的切入點

entry_points="""\ 
     [paste.app_factory] 
     main = MyApp:main_app 
     admin = MyApp:admin_app 
    """ 

main_appadmin_app應該是從功能myapp,這回可導入各自的WSGI應用程序)。

然後你就可以組裝複合材料:

[composite:main] 
use = egg:Paste#urlmap 
/= mainapp 
/files = adminapp 

[app:mainapp] 
use = egg:MyApp#main 

[app:adminapp] 
use = egg:MyApp#admin 
+0

正是我一直在尋找。謝謝!問題:對於新的啓動文件,.ini複合應用程序如何知道如何查找名爲say:init_admin.py的新啓動文件?我的主要應用程序文件默認情況下稱爲__init__.py,它在啓動時運行(不用說),但如果我的新文件被稱爲不同的東西,在哪裏「鏈接」它與我的.ini文件中的附加應用程序? – JohnZ

+0

我已經將我的答案擴展了一下 – Sergey

+0

這很完美。謝謝。 – JohnZ

相關問題