Docker部署PostgreSQL与pgAdmin登出时CSRF Token错误排查
解决pgAdmin登出后CSRF令牌错误问题
问题描述
通过Docker部署PostgreSQL与pgAdmin后,点击登出按钮虽能成功跳转至登录页面,但终端会不定时出现两类错误:
ERROR pgadmin: 400 Bad Request: The CSRF session token is missing.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:
问题原因与修复方案
核心问题点
- Cookie路径不匹配:设置了
SCRIPT_NAME=/pgadmin4,但未同步配置Cookie的路径,导致CSRF令牌存储的Cookie无法被正确读取。 - SameSite配置冲突:本地HTTP环境下,
SESSION_COOKIE_SAMESITE='None'配合SESSION_COOKIE_SECURE=False会被浏览器拒绝存储Cookie,进而丢失CSRF令牌。 - 冗余配置干扰: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
相关产品推荐
相关产品推荐

