代码之家  ›  专栏  ›  技术社区  ›  whites11

kubernetes上的pgadmin4:使用elb时会话无效

  •  0
  • whites11  · 技术社区  · 5 年前

    我对pgadmin4有个奇怪的问题。

    我的设置

    • pgadmin 4.1部署于 kubernetes 使用 chorss/docker-pgadmin4 图像。一个吊舱仅用于简化故障排除;
    • Nginx ingress controller 作为集群上的反向代理;
    • Classic ELB 前置以平衡集群上传入的流量。

    ELB <=> NGINX <=> PGADMIN

    从dns的角度来看,pgadmin的主机名是指向elb的cname。

    问题

    应用程序是正确的,用户可以登录,所有的工作都很好。问题是,在几分钟(大约2-3分钟)后,会话将失效,并要求用户再次登录。不管是否积极使用pgadmin,都会发生这种情况。

    经过无数个小时的故障排除,我发现当elb的cname的dns解析切换到另一个ip地址时,问题就出现了。

    事实上,我试过:

    • 直接连接到吊舱 k8s service 's node port directly=>会话未过期;
    • 连接到 nginx (绕过ELB)直接=>会话未过期;
    • 映射“我的主机”文件中ELB的一个IP地址=>会话未过期。

    通过以上测试,我可以得出这样的结论:flask应用程序(pgadmin4显然是python flask应用程序)在主机名的远程地址更改之后,认为我的cookie无效。

    任何能帮助我解决这个问题的烧瓶显影剂?关于我可能遗漏的东西还有什么想法吗?

    0 回复  |  直到 5 年前
        1
  •  2
  •   Pampy    5 年前

    pgadmin 4似乎使用烧瓶安全进行身份验证:

    pgadmin使用flask安全模块管理应用程序安全和用户,并提供自助密码重置和密码更改等选项。

    https://www.pgadmin.org/docs/pgadmin4/dev/code_overview.html

    烧瓶安全似乎使用烧瓶登录:

    通过集成各种烧瓶扩展和库,这些特性中的许多都成为可能。它们包括: 烧瓶登录 …

    https://pythonhosted.org/Flask-Security/

    Flask登录似乎有一个称为“会话保护”的功能:

    当会话保护处于活动状态时,每个请求都会为用户的计算机生成一个标识符(基本上是IP地址和用户代理的安全散列)。如果会话没有关联的标识符,则将存储生成的标识符。如果它有一个标识符,并且它与生成的标识符匹配,那么请求就可以了。

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

    我会假设设置 login_manager.session_protection = None 会解决这个问题,但不幸的是我不知道如何在pgadmin中设置它。希望它能对你有所帮助。

        2
  •  1
  •   Tarun Lalwani    5 年前

    对于那些寻求解决方案的人,您需要在下面添加 config.py config_distro.py config_local.py

    配置本地.py

    SESSION_PROTECTION = None
    
    推荐文章