Azure PostgreSQL как служба — создание отдельного пользователя для каждой базы данных дает отказ в разрешении

Мое приложение является многопользовательским. Я создаю единую базу данных для каждого арендатора/пользователя. До сих пор я создавал все базы данных с помощью следующей команды из кода С#.

CREATE DATABASE @userDBName WITH OWNER = @dbOwner ENCODING = 'UTF8';

Таким образом, я вижу, что у всех баз данных один и тот же владелец, и этот владелец имеет доступ ко всем таблицам во всех базах данных.

Теперь, в соответствии с новым требованием безопасности, мы хотим реализовать то, что каждая база данных должна быть доступна только одному пользователю, а пользователь одной базы данных не должен иметь доступа к другой базе данных.

Поскольку я впервые имею дело с концепциями ролей/пользователей в Postgres, мне не удается найти удачу в том, что я делал до сих пор.

Я создал пользователей и попытался предоставить им доступ к одной базе данных.

CREATE USER test WITH ENCRYPTED PASSWORD '123456';
GRANT ALL PRIVILEGES ON DATABASE userdb1 TO test;

Теперь, когда в моей строке подключения в С# я даю пользователю Id = 'test' и пароль, как указано выше, я получаю сообщение об ошибке отказа в разрешении.

Кроме того, из PgAdmin, когда я захожу в базу данных и пытаюсь изменить владельца на нового пользователя, которого я создал выше, я получаю эту ошибку

ERROR:  must be member of role test

Что именно нужно сделать? Я изучил все возможные решения в Интернете и перепробовал почти все, но ничего не помогает.


person puneet    schedule 06.02.2019    source источник


Ответы (2)


Это довольно просто.

Подключитесь к базе данных как суперпользователь, затем запустите (при условии, что newowner — это роль, которая должна владеть базой данных):

REASSIGN OWNED BY oldowner TO newowner;
REVOKE CONNECT, TEMPORARY ON DATABASE mydb FROM PUBLIC;

Ошибка, которую вы получаете, связана с тем, что вы не являетесь суперпользователем.

person Laurenz Albe    schedule 06.02.2019
comment
ПЕРЕПОЗНАВАТЬ ВЛАДЕЛЬЦЕМ старого владельца новому владельцу; сделал бы это во всех базах данных для старого владельца. Я не могу этого сделать, пока не проверю, что это работает успешно. Кроме того, нужно ли запускать эту команду из базы данных Postgres? - person puneet; 06.02.2019
comment
Это повлияет только на объекты в базе данных, к которой вы подключены. Вы можете запустить его из инструмента запросов, если вам действительно нравится pgAdmin. - person Laurenz Albe; 06.02.2019
comment
Я использую Azure PostgreSql как услугу. Это не позволяет вам создать суперпользователя самостоятельно. У него есть свой суперпользователь (azure_superuser), пароль от которого неизвестен - person puneet; 06.02.2019
comment
Затем вы должны сделать это объект для объекта. Или получить лучший хостинг. - person Laurenz Albe; 06.02.2019

Пока не имеет прямого отношения к вашему вопросу о том, как создавать новые базы данных. Возможно, вы захотите пересмотреть подход, предусматривающий использование одной базы данных для каждого клиента. При масштабировании до тысяч арендаторов могут возникнуть некоторые проблемы — https://www.citusdata.com/blog/2018/06

person CraigKerstiens    schedule 25.02.2019