django - 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")
解决方案
推荐阅读
- python - TensorFlow:尽管开始排队运行,但 Eval 永远不会结束
- java - Android - RecyclerView:我需要为每个 recyclerView 使用适配器和 ItemObject 吗?如何分别处理点击?
- redis - Redis:转储数据库并删除转储的键/值对
- php - PHP 以随机顺序输出我的 XML 提要
- scala - 带有案例类的抽象类的scala circe编码器/解码器
- mqtt - 订阅主题在 mqtt broker 中应该如何组织?
- javascript - Firebase 登录重定向
- javascript - 循环遍历带有对象的json数组
- php - 如何使用 laravel 5.4 在数据库中上传和保存多个图像?
- java - 刷新 JLabel - Java