如何在同一个应用程序中有两个登录/认证策略



我有一个标准的金字塔应用程序。在__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_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

最新更新