3

我对 PGAdmin4 有一个奇怪的问题。

我的设置

  • pgadmin4.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 => 会话不会过期;
  • 直接连接nginx(绕过 ELB)=> 会话不会过期;
  • 在我的主机文件中映射 ELB 的 IP 地址之一 => 会话不会过期。

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

任何可以帮助我解决此问题的 Flask 开发人员?关于我可能会丢失的东西的任何其他想法?

4

2 回答 2

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 地址和用户代理的安全哈希)。如果会话没有关联的标识符,则生成的标识符将被存储。如果它有一个标识符,并且它与生成的标识符相匹配,那么该请求是 OK 的。

https://flask-login.readthedocs.io/en/latest/#session-protection

我认为设置login_manager.session_protection = None可以解决问题,但不幸的是我不知道如何在 PGadmin 中设置它。希望它能以某种方式帮助你。

于 2019-02-19T09:26:03.527 回答
1

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

config_local.py

SESSION_PROTECTION = None
于 2019-08-11T18:18:55.863 回答