首页 > 解决方案 > Postgres - 无法访问数据库,没有访问权限

问题描述

我正在尝试访问我的 postgres 数据库,但出现权限被拒绝错误。我创建了数据库 + 表(在 python 中创建但它在那里):

sudo -u postgres psql
postgres=# create user lukasz1 with encrypted password '<password>';
postgres=# create database mydatabase owner lukasz1;

到目前为止,一切都很好:

                                  List of databases
    Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
------------+----------+----------+-------------+-------------+-----------------------
 mydatabase | lukasz1  | UTF8     | pl_PL.UTF-8 | pl_PL.UTF-8 | =Tc/lukasz1          +
            |          |          |             |             | lukasz1=CTc/lukasz1
 postgres   | postgres | UTF8     | pl_PL.UTF-8 | pl_PL.UTF-8 | 
 template0  | postgres | UTF8     | pl_PL.UTF-8 | pl_PL.UTF-8 | =c/postgres          +
            |          |          |             |             | postgres=CTc/postgres
 template1  | postgres | UTF8     | pl_PL.UTF-8 | pl_PL.UTF-8 | =c/postgres          +
            |          |          |             |             | postgres=CTc/postgres
(4 rows)

并且 lukasz1 是 mydatabase 的所有者。

但是当我尝试连接它时,我得到“权限被拒绝”。

我什至无法从我的表中选择以查看它,因为权限被拒绝:

mydatabase=> select article_id from articles;

错误:表格文章的权限被拒绝

我检查了类似问题的多个答案,并尝试检查用户 valid_until 并在该列中得到一个空值:

mydatabase=> select usename, valuntil from pg_user;
 usename  | valuntil 
----------+----------
 postgres | 
 lukasz   | 
 lukasz1  | 
(3 rows)

在其他问题中,我发现 pgAdmin4 可以解决这个问题,我应该将有效更改为无穷大,我尝试过但没有任何结果,因为不允许进行此更改。

mydatabase=> alter user lukasz1 valid until 'infinity';
ERROR:  permission denied

我检查了用户的权限并得到了这个:

postgres=# select * from pg_user;
 usename  | usesysid | usecreatedb | usesuper | userepl | usebypassrls |  passwd  | valuntil | useconfig 
----------+----------+-------------+----------+---------+--------------+----------+----------+-----------
 postgres |       10 | t           | t        | t       | t            | ******** |          | 
 lukasz   |    16384 | f           | f        | f       | f            | ******** |          | 
 lukasz1  |    17256 | f           | f        | f       | f            | ******** |          | 
 lukasz2  |    17437 | f           | f        | f       | f            | ******** |          | 
(4 rows)

我发现即使 lukasz1 是 mydatabase 的所有者,该帐户也无法对数据库执行任何操作。

接下来我检查的是完全为空的默认访问权限:

mydatabase=> \ddp
         Default access privileges
 Owner | Schema | Type | Access privileges 
-------+--------+------+-------------------
(0 rows)

我尝试更改密码,但没有任何改变。

ALTER USER lukasz1 WITH PASSWORD '<new password>';

我试图创建公共架构,但由于权限被拒绝而不允许:

mydatabase=> create schema public;
ERROR:  permission denied for database mydatabase

所有这一切都导致,带有 web 的 docker 容器无法访问带有 db 的容器

password authentication failed for user "lukasz1"

我什至无法查看 hba_file:

mydatabase=> show hba_file;
ERROR:  must be superuser or a member of pg_read_all_settings to examine "hba_file"

任何人都可以请建议我怎样才能使这项工作?

编辑: 我检查了登录并能够创建 lukasz 作为超级用户。

 usename  | usesysid | usecreatedb | usesuper | userepl | usebypassrls 
 lukasz   |    16384 | f           | t        | f       | f           

使用他的凭据时,我可以创建表、向其中插入数据等。

psql -d mydatabase -U lukasz -W -c "insert into articles values (1, 'Łukasz', 'lukasz', 'title','tekst')"

但是在创建容器之后我仍然得到

django.db.utils.OperationalError: FATAL:  password authentication failed for user "lukasz"

码头工人-compose.yml

version: "3.9"

services:
  db:
    image: postgres:9.6
    environment:
      - POSTGRES_DB=mydatabase
      - POSTGRES_USER=lukasz
      - POSTGRES_PASSWORD=password
    networks:
      - backend

  web:
    build: .
    command: python3 manage.py runserver 127.0.0.1:8080
    volumes:
      - .:/code
    ports:
      - "8080:8080"
    depends_on:
      - db
    networks:
      - backend


networks:
  backend:
    driver: bridge
    name: backend

设置.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'lukasz',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': 5432,
    }
}

sqlalchemy 引擎:

engine = create_engine("postgresql://lukasz:password@db:5432/mydatabase")

标签: djangopostgresqldocker

解决方案


推荐阅读