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