我对PGAdmin4有一个奇怪的问题。
我的设置
pgadmin
4.1使用kubernetes
映像部署在chorss/docker-pgadmin4
上。一个POD只是为了简化故障排除; Nginx ingress controller
作为集群上的反向代理; Classic ELB
位于前面,以平衡群集中传入的流量。 ELB <=> NGINX <=> PGADMIN
从DNS的角度来看,pgadmin的主机名是ELB的CNAME。
问题
可以正确访问应用程序,用户可以登录并且一切正常。问题是,大约两到三分钟后,该会话无效,并且要求用户再次登录。无论是否积极使用pgadmin,都将发生这种情况。
经过无数小时的故障排除,我发现当ELB的CNAME的DNS解析切换到另一个IP地址时会发生此问题。
事实上,我尝试过:
k8s service
的节点端口直接连接到Pod =>会话不会过期; nginx
(绕过ELB)=>会话不会过期; 鉴于以上测试,我得出的结论是,在更改主机名的远程地址后,Flask应用程序(显然是PGAdmin4是Python Flask应用程序)认为我的cookie无效。
任何Flask开发人员可以帮助我解决此问题吗?关于我可能会丢失的东西还有其他想法吗?
答案 0 :(得分:1)
PGadmin 4似乎使用Flask-Security进行身份验证:
pgAdmin利用Flask-Security模块管理应用程序的安全性和用户,并提供自助密码重置和密码更改等选项。
https://www.pgadmin.org/docs/pgadmin4/dev/code_overview.html
Flask-Security似乎使用Flask-Login:
通过集成各种Flask扩展和库,使其中许多功能成为可能。它们包括: 烧瓶登录 ...
https://pythonhosted.org/Flask-Security/
烧瓶登录似乎具有一个称为“会话保护”的功能:
会话保护处于活动状态时,每个请求都会为用户的计算机生成一个标识符(基本上是IP地址和用户代理的安全哈希)。如果会话没有关联的标识符,则将存储所生成的标识符。如果它有一个标识符,并且与生成的标识符匹配,则请求正常。
https://flask-login.readthedocs.io/en/latest/#session-protection
我认为设置login_manager.session_protection = None
可以解决此问题,但是不幸的是,我不知道如何在PGadmin中进行设置。希望它能以某种方式对您有所帮助。
答案 1 :(得分:1)
对于那些寻求解决方案的人,您需要在下面添加到config.py
或config_distro.py
或config_local.py
config_local.py
SESSION_PROTECTION = None