Kubernetes上的PGadmin4:使用ELB时会话无效

问题描述 投票:3回答:1

我对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)=>会话不会过期;
  • 映射我的主机文件中的一个ELB的IP地址=>会话不会过期。

鉴于上述测试,我得出结论,Flask应用程序(PGAdmin4显然是一个Python Flask应用程序)在我的主机名远程地址更改后正在考虑我的cookie无效。

任何可以帮我解决这个问题的Flask开发者?关于我可能会遗漏的事情的任何其他想法?

flask kubernetes pgadmin-4 flask-session
1个回答
2
投票

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中设置它。希望它可能会以某种方式帮助你。


1
投票

对于那些寻找解决方案的人,您需要在下面添加到config.pyconfig_distro.pyconfig_local.py

config_local.朋友

SESSION_PROTECTION = None
© www.soinside.com 2019 - 2024. All rights reserved.