You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署PostgreSQL与pgAdmin登出时CSRF Token错误排查

解决pgAdmin登出后CSRF令牌错误问题

问题描述

通过Docker部署PostgreSQL与pgAdmin后,点击登出按钮虽能成功跳转至登录页面,但终端会不定时出现两类错误:

  1. ERROR pgadmin: 400 Bad Request: The CSRF session token is missing.
  2. ERROR pgadmin: The CSRF token do not match.
    重复执行登录、连接服务器、登出操作,问题依旧;更换不同pgAdmin镜像也无法解决。当前访问地址为http://localhost:8082/pgadmin4,原docker-compose配置如下:
version: "3.7"

services:
        
  db:
    container_name: my_database
    image: postgres:14
    ports:
      - "5432:5432"
    networks:
      - internal_network
    environment:
      - POSTGRES_USER=some_user
      - POSTGRES_PASSWORD=some_password
      - POSTGRES_DB=some_db
      - POSTGRES_PORT=5432
      - POSTGRES_HOST=db
      - POSTGRES_DIALECT=postgresql
      - POSTGRES_DRIVER=psycopg2

  pgadmin:
    container_name: my_pgadmin
    image: dpage/pgadmin4:6.14
    ports:
     - "8082:8082"
    networks:
      - internal_network
    environment:
      - PGADMIN_DEFAULT_EMAIL=some_email
      - PGADMIN_DEFAULT_PASSWORD=some_password
      - PGADMIN_LISTEN_PORT=8082
      - SCRIPT_NAME=/pgadmin4
      - PGADMIN_CONFIG_SESSION_COOKIE_SAMESITE='None'
      - PGADMIN_CONFIG_SESSION_COOKIE_SECURE=False
      - PGADMIN_CONFIG_SESSION_COOKIE_HTTPONLY=False
      - PGADMIN_CONFIG_ENHANCED_COOKIE_PROTECTION=False
    depends_on:
      - db
    links:
      - "db:pg_server"

networks:
  internal_network: 

问题原因与修复方案

核心问题点

  1. Cookie路径不匹配:设置了SCRIPT_NAME=/pgadmin4,但未同步配置Cookie的路径,导致CSRF令牌存储的Cookie无法被正确读取。
  2. SameSite配置冲突:本地HTTP环境下,SESSION_COOKIE_SAMESITE='None'配合SESSION_COOKIE_SECURE=False会被浏览器拒绝存储Cookie,进而丢失CSRF令牌。
  3. 冗余配置干扰:PostgreSQL官方镜像不识别POSTGRES_PORT、POSTGRES_HOST等ORM框架专属配置项,属于无效配置。

修改后的docker-compose配置

version: "3.7"

services:
        
  db:
    container_name: my_database
    image: postgres:14
    ports:
      - "5432:5432"
    networks:
      - internal_network
    environment:
      - POSTGRES_USER=some_user
      - POSTGRES_PASSWORD=some_password
      - POSTGRES_DB=some_db
      # 移除PostgreSQL镜像不支持的冗余配置
      # - POSTGRES_PORT=5432
      # - POSTGRES_HOST=db
      # - POSTGRES_DIALECT=postgresql
      # - POSTGRES_DRIVER=psycopg2

  pgadmin:
    container_name: my_pgadmin
    image: dpage/pgadmin4:6.14
    ports:
     - "8082:8082"
    networks:
      - internal_network
    environment:
      - PGADMIN_DEFAULT_EMAIL=some_email
      - PGADMIN_DEFAULT_PASSWORD=some_password
      - PGADMIN_LISTEN_PORT=8082
      - SCRIPT_NAME=/pgadmin4
      # 添加Cookie路径,与SCRIPT_NAME保持一致
      - PGADMIN_CONFIG_SESSION_COOKIE_PATH='/pgadmin4'
      # 本地HTTP环境使用默认Lax策略,移除无效的SameSite=None配置
      - PGADMIN_CONFIG_SESSION_COOKIE_SECURE=False
      - PGADMIN_CONFIG_ENHANCED_COOKIE_PROTECTION=False
    depends_on:
      - db
    links:
      - "db:pg_server"

networks:
  internal_network: 

后续操作

修改配置后,需要清理旧容器与数据卷,重新启动服务:

docker-compose down -v
docker-compose up -d

内容的提问来源于stack exchange,提问作者winter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:50:51