Назад | Перейти на главную страницу

Предоставление прав на базу данных postgresql другому пользователю

Я пытаюсь настроить систему с базой данных PostgreSQL для каждого пользователя с пулом ресурсов PHP-FPM для связанной учетной записи. Мне нужно предоставить все привилегии в базе данных другому пользователю, но кажется, что это можно сделать только для таблиц.

я пробовал

grant all privileges on database username to username_shadow

но это дает только ограниченные привилегии.

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

Не пытайтесь дублировать наборы прав подобным образом, это станет кошмаром для менеджмента. Используйте роли и наследование.

Вместо этого создайте ROLE (группа) и сделайте обоих пользователей членами роли. Предоставьте роли необходимые права и права собственности на любые требуемые объекты, и пользователи автоматически унаследуют эти права доступа.

Чтобы выполнить переход, либо:

  • Превратите существующего пользователя в общую роль, переименовав его и отбросив LOGIN правильно, превратив его из роли входа (пользователя) в роль (группу) без входа в систему, затем создайте нового пользователя с исходным именем; или

  • Вручную GRANT новой роли все необходимые права, используя GRANT ... ON DATABASE, GRANT ... ON SCHEMA, GRANT ... ON ALL TABLES IN SCHEMA, и т.д.

Вот демонстрация первого подхода. Скажем, у нас есть оригинальный пользователь с именем test с владением столом и некоторыми другими грантами:

regress=# CREATE USER test WITH PASSWORD 'original user pw';
CREATE ROLE
regress=# CREATE TABLE testtab(x integer);
CREATE TABLE
regress=# ALTER TABLE testtab OWNER TO test;
ALTER TABLE

Мы можем преобразовать его в общую роль и создать нового пользователя с тем же именем:

regress=# ALTER ROLE test RENAME TO test_group;
NOTICE:  MD5 password cleared because of role rename
ALTER ROLE
regress=# ALTER ROLE test_group NOLOGIN;
ALTER ROLE
regress=# CREATE USER test IN GROUP test_group PASSWORD 'original user pw';
CREATE ROLE

Пока вы устанавливаете один и тот же пароль, пользователь не заметит разницы.

Теперь вы можете создать нового пользователя и добавить его к той же роли, предоставив ему тот же доступ, что и исходный test пользователь имел до того, как вы превратили его в роль test_group. В этом случае я использую отдельные шаги для создания пользователя, а затем предоставления ему членства в роли; эффект такой же, как и выше, я просто показываю вам два разных способа сделать это:

regress=# CREATE USER newuser PASSWORD 'fred';
CREATE ROLE
regress=# GRANT test_group TO newuser;
GRANT ROLE

Сейчас newuser жестяная банка SELECT * FROM testtab даже если testtab принадлежал пользователю test и не было GRANTs, чтобы другие пользователи могли получить к нему доступ.