Я немного запутался в настройке разрешений в PostgreSQL.
У меня есть эти роли:
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
admin | Superuser, Create role, Create DB, Replication | {}
meltemi | Create role, Create DB | {rails}
rails | Create DB, Cannot login | {}
myapp | | {rails}
и базы данных:
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
---------------------+--------+----------+-------------+-------------+-------------------
myapp_production | rails | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
...
У пользователя myapp
нет проблем с запросом к myapp_production
базе данных, добавлением и удалением записей. Я хотел бы meltemi
также иметь возможность запрашивать ту же базу данных. Итак, я создал роль, rails
которая владеет базой данных и сделал meltemi
и myapp
членов и членов rails
. Но я все еще получаю permission denied for relation
ошибки. Meltemi
может просматривать схему, но не может запрашивать БД.
Я только что заметил (с помощью \dt
команды), что myapp
является владельцем таблиц:
List of relations
Schema | Name | Type | Owner
--------+-------------------+-------+-------
public | events | table | myapp
public | schema_migrations | table | myapp
...
public | users | table | myapp
...
Таблицы были созданы с помощью ORM (миграции ActiveRecord от Rails).
Я знаю, что авторизация в PostgreSQL сильно отличается (в отличие от MySQL и других, которые я использовал). Как мне настроить свою базу данных, чтобы разные пользователи могли получить к ней доступ? Некоторые должны быть в состоянии CRUD, но другие могут только читать, и т.д ...
Спасибо за любую помощь. Извините, я знаю, что это очень простой вопрос, но я не смог найти ответ сам.
источник
myapp
вместоrails
выше? Потому чтоmyapp
владеет таблицами (я никогда не указывал, что миграция должна иметь). Во всяком случае, было бы Сорта иметь смысл , если я переименовалmyapp
в ,myapp_group
а затем сделал новый пользователь ,myapp
который рельсы приложения будет использовать для подключения к БД. Сделайтеmyapp
и существующиеmeltemi
, оба участникиmyapp_group
роли. Но что происходит, когда я запускаю следующую миграцию. не будет ли оно принадлежатьmyapp
воссозданию проблемы заново?!?roles
(начиная с версии 8.1). Условияuser
иgroup
хранятся по историческим причинам и совместимости. По сути, «группа» - это роль без права входа в систему. Вы можете предоставить ,myapp
чтобыmeltemi
даже еслиmyapp
это просто еще один «пользователь». Начните с чтения руководства здесь .roles
противgroups
противusers
разделения в Postgres, по крайней мере , я думаю , что я делаю. Извините, что использовал неправильную (и запутанную) терминологию выше. Но я до сих пор не понимаю, как настроить свою базу данных, чтобы роль без входа в систему СВОИЛА базу данных и две роли входа в систему,myapp
иmeltemi
обе могли иметь полный доступ. Одной из этих ролейmyapp
будет запуск миграций Rails , которые неизбежно будут создавать новые таблицы, которые снова будут принадлежать пользователюmyapp
входа в систему. Должен ли я просто статьmeltemi
«членом»myapp
и покончить с этим? Но это только кажется глупым ... нет?!?myapp
естьmeltemi
, то это было бы правильно. Если вы хотитеmeltemi
получить только часть привилегий, это не так. Затем создайте групповую роль для хранения набора привилегий и предоставьте егоmeltemi
. Скорее всего, вас заинтересует этот связанный вопрос о SO . Я ответил объясняяDEFAULT PRIVILEGES
SET ROLE
команду в начало ваших миграций иRESET ROLE
до конца, но я бы не стал доверять Rails, чтобы все выполнялось аккуратно по порядку. Эрвин прав; в этом случае лучший обходной путь будет дляGRANT
пользователя: rails передает права собственности другому пользователю, используя 1-го пользователя в качестве группы для второго.