我有一个标准的金字塔应用程序。在__init__.py
main方法中,我必须config.add_request_method(AuthHelper.get_user, 'user', reify=True)
设置一个可全局访问的用户对象。
我将所有用户存储在一个user
表中,并通过访问当前登录的用户self.request.user
。我的问题是,我想创建一个与应用程序其余部分完全分开的管理门户,并且希望将这些“管理员”存储在名为的表中admin
。这些管理员不是用户-他们具有单独的登录页面,并且与user表没有任何关系。
我在为管理员设置授权时遇到麻烦。例如,remember(self.request, admin.id, max_age=...
就身份验证而言,无法区分成功登录的用户和成功登录的admin。即使A在不同的视图上使用不同的凭据登录,也User.id = 1
可以访问的管理门户Admin.id == 1
。
我曾考虑过Admin.username
在remember
方法中使用,但仍然与config.add_request_method(AuthHelper.get_user...)
(可以理解)相冲突,后者采用User.id
。
如何设置授权策略,以便如果您从Admin门户登录名成功登录,则您的授权与从主索引页面登录的普通用户是分开的,反之亦然?
我觉得这是一个相对基本的需求,因此我必须缺少实现此目的的简单方法。谢谢。
对于“管理门户,与应用程序的其余部分完全分开”,一个选项是设置单独的WSGI应用程序,该应用程序将具有单独的request
对象,身份验证策略等。
然后,您可以将两个应用程序与WSGI“ composite”组合在一起,这样就可以安装“普通”应用程序,/
并且可以打开admin /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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句