|
|
|
Запрос и привилегии
|
|||
|---|---|---|---|
|
#18+
Всем доброго времени суток. Помогите новичку. Вот есть юзер, например test_user, и ему даны 2-е привилегии на базу: Код: sql 1. 2. И я хочу с помощью sql запроса узнать, есть ли для данного юзера привилегия CONNECT и CREATE на эту базу. Запрос, который бы выдавал что-то типа: Код: sql 1. 2. 3. 4. 5. Соответственно 2-е единички, т.к. обе привилегии у юзера есть, а если например у него нет привилегии CREATE на базу "TEST_DB", то запрос выдает: Код: sql 1. 2. 3. 4. 5. Как написать такой запрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 16:38 |
|
||
|
Запрос и привилегии
|
|||
|---|---|---|---|
|
#18+
bobanman, посмотри функцию has_database_privilege Код: sql 1. 2. Можно еще покурить над выводом: select datname, aclexplode(datacl) from pg_database; Но нужно учитывать, что функция aclexplode недокументирована. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 17:03 |
|
||
|
Запрос и привилегии
|
|||
|---|---|---|---|
|
#18+
Павел Лузановbobanman, посмотри функцию has_database_privilege Код: sql 1. 2. Можно еще покурить над выводом: select datname, aclexplode(datacl) from pg_database; Но нужно учитывать, что функция aclexplode недокументирована. Круто, спасибо, похоже на правду. А можно еще вопрос, вот создаю голого пользователя, не даю ему вообще ни одной привилегии, а он все равно к базе коннектится, в чем тогда смысл Код: sql 1. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 17:37 |
|
||
|
Запрос и привилегии
|
|||
|---|---|---|---|
|
#18+
bobanman, по умолчанию дю грантована на паблика перед тем, как грнтовать кого---то -- удалите паблика из грантов Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 17:58 |
|
||
|
Запрос и привилегии
|
|||
|---|---|---|---|
|
#18+
Добавлю к ответу qwwq, что псевдопользователю public (а значит всем) слишком много привилегий выдано по умолчанию. Это не только connect, но temporary на базы данных. А что самое примечательное, еще и execute на любые функции (при наличии usage на схему). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 18:59 |
|
||
|
Запрос и привилегии
|
|||
|---|---|---|---|
|
#18+
qwwqbobanman, по умолчанию дю грантована на паблика перед тем, как грнтовать кого---то -- удалите паблика из грантов Код: sql 1. Ну а эта прекрасная функция Код: sql 1. я так понимаю справляется с этой ситуацией? Ну т.е. если пользователю явно привилегия коннект на базу не выдана, но он унаследовал ее от public? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 19:53 |
|
||
|
Запрос и привилегии
|
|||
|---|---|---|---|
|
#18+
bobanman, как правило наличие привилегии паблику, там, где она д.б. по умолчанию -- это вообще отсутствие какой--либо инфы в полях типа datacl (создайте новую бд, и прочтите её datacl). т.е. наследование тут неявное. а ф--я таки, судя по имени, проверяет наличие привилегии, а не явно выданного гранта . Т.е. вы можете унаследовать чьи--то права, не только паблика, не имея о себе явной записи в соотв. массиве прав. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 20:56 |
|
||
|
Запрос и привилегии
|
|||
|---|---|---|---|
|
#18+
qwwqкак правило наличие привилегии паблику, там, где она д.б. по умолчанию -- это вообще отсутствие какой--либо инфы в полях типа datacl (создайте новую бд, и прочтите её datacl). Маленькая поправка. Информация о правах public в полях *acl есть. Это те строки, где слева от знака равно пусто, вместо имени пользователя: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Первая строка в массиве, это как раз права public. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 23:01 |
|
||
|
Запрос и привилегии
|
|||
|---|---|---|---|
|
#18+
Отберем у public привилегии на эту БД - строчка пропадет: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.02.2016, 23:06 |
|
||
|
Запрос и привилегии
|
|||
|---|---|---|---|
|
#18+
Павел Лузанов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. Или "её там нет!";"она там была";"она там ... будет" (сс) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2016, 10:46 |
|
||
|
Запрос и привилегии
|
|||
|---|---|---|---|
|
#18+
qwwq, Всё просто. Если на объект еще никто никому не выдавал прав, то поле *acl пустое, что означает использование прав по умолчанию. В твоем примере это база t_01. Но стоит только, что-то кому-то выдать/отнять как умолчательные привилегии появляются, вместе с тем, что выдано/отнято. Это хорошо видно на примере t_05, когда сначала выдали и тут же отняли привилегию connect у пользователя test. В итоге остались только привилегии по умолчанию, но теперь в явном виде: - public имеет temporary, connect - владелец имеет всё. Документация : "Если колонка "Права доступа" для данного объекта пуста, это значит, что для объекта действуют стандартные права (то есть колонка прав содержит NULL). Права по умолчанию всегда включают все права для владельца и могут также включать некоторые права для PUBLIC в зависимости от типа объекта, как разъяснялось выше. Первая команда GRANT или REVOKE для объекта приводит к проявлению записи прав по умолчанию (например, {miriam=arwdDxt/miriam}), а затем изменяет эту запись в соответствии с заданным запросом. " ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.02.2016, 12:58 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39160495&tid=1997476]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
161ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 200ms |
| total: | 443ms |

| 0 / 0 |
