powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос и привилегии
11 сообщений из 11, страница 1 из 1
Запрос и привилегии
    #39160395
bobanman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток.

Помогите новичку. Вот есть юзер, например test_user, и ему даны 2-е привилегии на базу:

Код: sql
1.
2.
CREATE USER test_user PASSWORD 'test_user';
GRANT CONNECT, CREATE ON DATABASE "TEST_DB" TO test_user;



И я хочу с помощью sql запроса узнать, есть ли для данного юзера привилегия CONNECT и CREATE на эту базу. Запрос, который бы выдавал что-то типа:

Код: sql
1.
2.
3.
4.
5.
privelege  | has   |
-------------------
CONNECT    | 1    |
--------------------
CREATE    | 1     | 



Соответственно 2-е единички, т.к. обе привилегии у юзера есть, а если например у него нет привилегии CREATE на базу "TEST_DB", то запрос выдает:

Код: sql
1.
2.
3.
4.
5.
privelege  | has |
-------------------
CONNECT    | 1    |
--------------------
CREATE    | 0     | 



Как написать такой запрос?
...
Рейтинг: 0 / 0
Запрос и привилегии
    #39160441
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobanman,

посмотри функцию has_database_privilege

Код: sql
1.
2.
select has_database_privilege('test_user', 'test_db', 'connect') as connect_priv,
          has_database_privilege('test_user', 'test_db', 'create') as create_priv,;



Можно еще покурить над выводом: select datname, aclexplode(datacl) from pg_database;
Но нужно учитывать, что функция aclexplode недокументирована.
...
Рейтинг: 0 / 0
Запрос и привилегии
    #39160476
bobanman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел Лузановbobanman,

посмотри функцию has_database_privilege

Код: sql
1.
2.
select has_database_privilege('test_user', 'test_db', 'connect') as connect_priv,
          has_database_privilege('test_user', 'test_db', 'create') as create_priv,;



Можно еще покурить над выводом: select datname, aclexplode(datacl) from pg_database;
Но нужно учитывать, что функция aclexplode недокументирована.

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

Код: sql
1.
GRANT CONNECT ON DATABASE

?
...
Рейтинг: 0 / 0
Запрос и привилегии
    #39160495
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobanman,

по умолчанию дю грантована на паблика
перед тем, как грнтовать кого---то -- удалите паблика из грантов
Код: sql
1.
REVOKE CONNECT ON DATABASE test_db FROM public;
...
Рейтинг: 0 / 0
Запрос и привилегии
    #39160521
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавлю к ответу qwwq, что псевдопользователю public (а значит всем) слишком много привилегий выдано по умолчанию.
Это не только connect, но temporary на базы данных.
А что самое примечательное, еще и execute на любые функции (при наличии usage на схему).
...
Рейтинг: 0 / 0
Запрос и привилегии
    #39160536
bobanman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwqbobanman,

по умолчанию дю грантована на паблика
перед тем, как грнтовать кого---то -- удалите паблика из грантов
Код: sql
1.
REVOKE CONNECT ON DATABASE test_db FROM public;



Ну а эта прекрасная функция

Код: sql
1.
select has_database_privilege('test_user', current_database(), 'connect') as create_priv;



я так понимаю справляется с этой ситуацией? Ну т.е. если пользователю явно привилегия коннект на базу не выдана, но он унаследовал ее от public?
...
Рейтинг: 0 / 0
Запрос и привилегии
    #39160545
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bobanman,
как правило наличие привилегии паблику, там, где она д.б. по умолчанию -- это вообще отсутствие какой--либо инфы в полях типа datacl (создайте новую бд, и прочтите её datacl). т.е. наследование тут неявное.

а ф--я таки, судя по имени, проверяет наличие привилегии, а не явно выданного гранта . Т.е. вы можете унаследовать чьи--то права, не только паблика, не имея о себе явной записи в соотв. массиве прав.
...
Рейтинг: 0 / 0
Запрос и привилегии
    #39160593
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqкак правило наличие привилегии паблику, там, где она д.б. по умолчанию -- это вообще отсутствие какой--либо инфы в полях типа datacl (создайте новую бд, и прочтите её datacl).
Маленькая поправка. Информация о правах public в полях *acl есть.
Это те строки, где слева от знака равно пусто, вместо имени пользователя:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
postgres=# create user test_user;
CREATE ROLE
postgres=# create database test_db;
CREATE DATABASE
postgres=# grant connect, create on database test_db to test_user;
GRANT
postgres=# \l test_db
                                 List of databases
  Name   |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
---------+----------+----------+-------------+-------------+-----------------------
 test_db | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres         +
         |          |          |             |             | postgres=CTc/postgres+
         |          |          |             |             | test_user=Cc/postgres
(1 row)


Первая строка в массиве, это как раз права public.
...
Рейтинг: 0 / 0
Запрос и привилегии
    #39160595
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отберем у public привилегии на эту БД - строчка пропадет:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
postgres=# revoke all on DATABASE test_db from public;
REVOKE
postgres=# \l test_db
                                 List of databases
  Name   |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
---------+----------+----------+-------------+-------------+-----------------------
 test_db | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | postgres=CTc/postgres+
         |          |          |             |             | test_user=Cc/postgres
(1 row)
...
Рейтинг: 0 / 0
Запрос и привилегии
    #39160803
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Лузановqwwqкак правило наличие привилегии паблику, там, где она д.б. по умолчанию -- это вообще отсутствие какой--либо инфы в полях типа datacl (создайте новую бд, и прочтите её datacl).
Маленькая поправка. Информация о правах public в полях *acl есть.
....

"И ты, Сара, права"

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
CREATE USER test;
CREATE DATABASE t_01;
CREATE DATABASE t_02;
CREATE DATABASE t_03;
CREATE DATABASE t_04;
CREATE DATABASE t_05;
GRANT CONNECT ON DATABASE t_02 TO test;
GRANT CONNECT ON DATABASE t_03 TO public;
REVOKE CONNECT ON DATABASE t_04 FROM public;
GRANT CONNECT ON DATABASE t_05 TO test;REVOKE CONNECT ON DATABASE t_05 FROM test;
select datname,datacl from pg_database where datname LIKE 't\_%';
------------------------------------------------------------------------
't_01';''				-- ЧЯДНТ ?
't_02';'{=Tc/postgres,postgres=CTc/postgres,test=c/postgres}'
't_03';'{=Tc/postgres,postgres=CTc/postgres}'
't_04';'{=T/postgres,postgres=CTc/postgres}'
't_05';'{=Tc/postgres,postgres=CTc/postgres}'

------------------------------------------------------------------------
DROP DATABASE t_01;
DROP DATABASE t_02;
DROP DATABASE t_03;
DROP DATABASE t_04;
DROP DATABASE t_05;
DROP USER test;




Или "её там нет!";"она там была";"она там ... будет" (сс)
...
Рейтинг: 0 / 0
Запрос и привилегии
    #39160993
Павел Лузанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwq,

Всё просто. Если на объект еще никто никому не выдавал прав, то поле *acl пустое, что означает использование прав по умолчанию.
В твоем примере это база t_01.

Но стоит только, что-то кому-то выдать/отнять как умолчательные привилегии появляются, вместе с тем, что выдано/отнято.
Это хорошо видно на примере t_05, когда сначала выдали и тут же отняли привилегию connect у пользователя test. В итоге остались только привилегии по умолчанию, но теперь в явном виде:
- public имеет temporary, connect
- владелец имеет всё.

Документация :
"Если колонка "Права доступа" для данного объекта пуста, это значит, что для объекта действуют стандартные права (то есть колонка прав содержит NULL). Права по умолчанию всегда включают все права для владельца и могут также включать некоторые права для PUBLIC в зависимости от типа объекта, как разъяснялось выше. Первая команда GRANT или REVOKE для объекта приводит к проявлению записи прав по умолчанию (например, {miriam=arwdDxt/miriam}), а затем изменяет эту запись в соответствии с заданным запросом. "
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос и привилегии
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]