postgresql 9.1 - доступ к таблицам через функции - PullRequest
7 голосов
/ 12 февраля 2012

У меня есть 3 роли: суперпользователь, poweruser и пользователь.У меня есть таблица «data» и функции data_select и data_insert.

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

Пользователь может запускать только функцию data_select, poweruser может запускать как data_select, так и data_insert.

Итак, я могу создатьпользователи alice, bob, ... и наследуют им привилегии пользователя или poweuser.

Это реально достижимо?Я борюсь с этим уже второй день и никуда не денусь.

Спасибо за ваше время.

1 Ответ

8 голосов
/ 12 февраля 2012

Да, это выполнимо.

"superuser" может быть фактическим superuser, postgres по умолчанию.Я переименовываю роль для простых пользователей в usr, потому что user является зарезервированным словом - не используйте его в качестве идентификатора.

CREATE ROLE usr;
CREATE ROLE poweruser;
GRANT usr TO poweruser;  -- poweruser can do everything usr can.

CREATE ROLE bob PASSWORD <password>;
GRANT poweruser TO bob;

CREATE ROLE alice PASSWORD <password>;
GRANT usr TO alice;

REVOKE ALL ON SCHEMA x FROM public;
GRANT USAGE ON SCHEMA x TO usr;

REVOKE ALL ON TABLE x FROM public;
REVOKE ALL ON TABLE y FROM public;

CREATE FUNCTION
  ...
SECURITY DEFINER;

REVOKE ALL ON FUNCTION ... FROM public;
GRANT EXECUTE ON FUNCTION a TO usr;
GRANT EXECUTE ON FUNCTION b TO poweruser;

Или вы можете создать роли демона без входа в систему, чтобы владетьфункции и владеть соответствующими правами на столе.Это было бы еще более безопасно.

Если вы идете по этому маршруту, вы полюбите love ALTER DEFAULT PRIVILEGES (введено в PostgreSQL 9.0). Подробнее в этом связанном ответе .

Прочитайте главу Запись SECURITY DEFINER Безопасные функции в руководстве.

...