2017-02-28 144 views
0

在电子医疗相关服务的背景下,最终用户(健康操作员,医生和物理治疗师)在同一物理环境中工作并共享一台客户端PC与我的后端进行交互,要求我为他们提供一种快速切换不同账户的机制(大多数情况下,安全不是一个问题,因为他们习惯在局域网内工作,但偶尔他们可能会从远程客户端工作,所以我必须保留身份验证/授权后端)。他们只会登录一次,然后在使用Web应用程序之前,会从组合框中选择他们的登录帐户(排序)。Django多个并发登录帐户

UI模型可能与GMail中的模型相同,它可以保留多个登录用户帐户并通过右上角的帐户选择器在它们之间切换。

我不是django认证专家,所以我甚至无法分辨这是否可能在基于django的应用程序的上下文中。

有没有人知道任何现成的应用程序/中间件来完成这件事?或者,如果我必须扩展或修改现有的代码,也许指向正确的方向?

非常感谢。

回答

1

我还没有找过这方面的任何现有的解决方案,所以这是我怎么会去了解它从头开始。

您需要将存储添加到用户会话以容纳多个用户。目前,它看起来很像:

{'_auth_user_backend': 'membership.auth_backends.MyCustomAuthenticationBackend', 
'_auth_user_hash': 'e2c8ecf1e7ecdbd<snip>', 
'_auth_user_id': '3806'} 

,我想补充一个数组到会话:

logged_in_users = [{'_auth_user_backend': ... }, {}, {}] # one auth dict per user 

然后,当你“切换用户”,编辑会话对象来移动用户的身份验证信息(ID ,散列和后端)加入会话中的顶级域名。

您还必须编写一个自定义登录函数,将登录名存储在logged_in_users array中,并取出current login function中刷新会话的位,如果该密钥与其他登录用户的会话相同。同样,您需要考虑注销时会发生什么。

+0

这很有道理。我会尝试遵循建议的方法,并让您知道这是否有效。非常感谢。 – Blazor

+1

我已经完成了初稿的实施。我几乎采用了你的策略,除了'logged_in_users'成为字典的关键而不是列表(这样我就可以使用它的ID来查找已经登录的用户)。 唯一明显的缺点是,我不得不修改专用的Django文件('__init __。py'在结尾的链接),以防止它就像你说的冲洗会议。我不是这种方法的忠实粉丝,所以我会在接受你的方案之前等待更清洁的解决方案。 非常感谢,不过这真是一个非常棒的回答! – Blazor

+0

这个改变是个好主意,是的,我并不完全清楚。如果你不希望修改'django.contrib.auth'(我同意,你不应该!),那么你应该写自己的登录/注销功能(只复制现有的并去掉了会议休闲位),然后在您的视图中使用新功能。这一切都可以很好地转化为可再发布的应用程序。 – neomanic