【发布时间】:2016-04-13 03:47:35
【问题描述】:
我构建了这个内部 Web 应用程序(基于 Flask 构建并与 Gunicorn 一起使用),多年来它从未存储任何类型的用户数据或会话数据,并且运行良好。现在我添加了一个身份验证页面,使用我的组织的 LDAP - 用户输入用户名和密码(他们用来登录他们的机器),应用程序验证 LDAP 服务器上的凭据,如果一切匹配,则让用户通过。
当我只使用一个进程 (gunicorn -w 1) 为应用程序提供服务时,它可以正常工作。但是当我使用多个进程为应用程序提供服务时,我会出现不稳定的行为!有时即使用户名和密码正确,身份验证也会失败。有时,如果一个用户进行了身份验证,那么其他用户将被视为经过身份验证。有时用户进行身份验证并开始使用应用程序一段时间,然后单击某些内容并重定向到登录页面(所有功能都经过修饰以检查用户是否已通过身份验证)。
我的猜测是我未能正确隔离用户 - 用户 X 输入了正确的用户名和密码,但是当点击“提交”时,应用程序认为用户 Y 没有经过身份验证,因此拒绝访问(这里是认证逻辑:我检查flask.session是否有密钥user;如果有,用户通过;如果没有,用户被重定向到登录页面,如果认证成功,我将用户名存储在flask.session["user"] )。
我该如何调试呢?如果我的猜测是正确的,那么如何确保用户的凭据不会混淆?
【问题讨论】:
-
您提到它适用于一个进程,并且“有时即使用户名和密码正确,身份验证也会失败”。不同的进程是否肯定连接到同一个数据库?
-
您是否可以在全局对象上设置会话信息?如果你在本地运行,如果你用一个用户登录,然后切换浏览器会发生什么?您仍然通过身份验证吗?
-
我将会话信息存储在 Flask 的 session 对象中。如果我切换浏览器,行为就会不稳定,就像使用同一个浏览器一样。
-
我刚刚注意到
sessions没有持续存在(它显然无缘无故地变空了)。所以,我用谷歌搜索了“flask session gunicorn”,找到了这个answer,并将我的app.secret_key固定(而不是随机) - 现在session似乎持续存在并且事情似乎正在工作。但现在说还为时过早,我需要对其进行更多测试(我会在这里报告)。
标签: python authentication flask gunicorn