我有一个标准的金字塔应用程序。在__init__.py
main方法中,我有一个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
。
如何设置授权策略,使您从Admin门户登录成功时,您的授权与从主索引页登录的普通用户分开,反之亦然?
我觉得这是一个相对基本的需求,所以我一定错过了一个简单的方法来实现它。谢谢你。
对于"管理门户,与应用程序的其余部分完全分离",一个选项将是设置一个单独的WSGI应用程序,该应用程序将具有单独的request
对象,身份验证策略等。
然后你可以用WSGI"复合"将两个应用程序组装在一起,这样你的"正常"应用程序挂载在/
上,而你的管理员在/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_app
和admin_app
应该是可从myapp
导入的函数,它们返回各自的WSGI应用程序)。
然后你可以组装一个复合:
[composite:main]
use = egg:Paste#urlmap
/ = mainapp
/files = adminapp
[app:mainapp]
use = egg:MyApp#main
[app:adminapp]
use = egg:MyApp#admin