Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Логика прав на функции внутри view  [new]
Dany305
Member

Откуда:
Сообщений: 99
set role to postgres; 
drop view if exists test_view.view_v;
drop schema if exists test_view;
drop function if exists test_func.func();
drop schema if exists test_func;

create schema test_view;
create schema test_func;

create or replace function test_func.func() returns integer
as 'select 1 from pg_sleep(2);' language sql;
revoke all on function test_func.func() from public;

create view test_view.view_v as select * from test_func.func();
revoke all on table test_view.view_v from public;

grant usage on schema test_view to srv_dc; 
grant select on test_view.view_v to srv_dc; 

-- 1)
set role to srv_dc; 
select * from test_view.view_v
-- ERROR:  permission denied for function func

-- 2)
reset role;
grant execute on function test_func.func() to srv_dc; 
set role to srv_dc; 
select * from test_view.view_v;
-- ok

--3)
set role to srv_dc; 
select * from test_func.func();
-- ERROR:  permission denied for schema test_func


Хотим, чтобы пользователь srv_dc мог обращаться к test_view.view_v, но не мог вызывать test_func.func() напрямую

Какая логика стоит за необходимостью назначать права на функции, вызываемые из view?
Почему прав владельца недостаточно? Где про эту логику прочитать?

Сообщение было отредактировано: 14 июл 20, 15:15
14 июл 20, 15:15    [22167235]     Ответить | Цитировать Сообщить модератору
 Re: Логика прав на функции внутри view  [new]
О-О-О
Member

Откуда: Нижний Новгород
Сообщений: 285
Dany305,

С правами все запутано.
Но хорошо описано в книге PostgreSQL 11 (Ганс-Юрген Шёнинг = Глава 8)
и в книге PostgreSQL 10 (Салахалдин Джуба, Андрей Волков = Глава 11)

Это как рекурсивный запрос в 4 этажа. В общем очень запутанно.
Но есть выход - создаются разные группы/права и вкладываются как матрешка.
то есть одной группе можно назначить кучу прав в результате он может делать то что и требовалось.
Я с наскоку в общем то понял, но вот там это так закручено. В общем, читайте 2-3 дня и вопрос решите. Явно быстрее чем на форуме.

В общем, в инструкции по постгрес все очень слабо расписано. В книгах выше все разжевано довольно понятно и доступно.
Эта тема очень специфична. Обычно доступ делается через сайт, либо на локальной машине или через внешнюю оболочку программы (Python).
.
15 июл 20, 09:24    [22167549]     Ответить | Цитировать Сообщить модератору
 Re: Логика прав на функции внутри view  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 4233
Dany305,

почитать естественно в документации https://www.postgresql.org/docs/9.4/rules-privileges.html
"Relations that are used due to rules get checked against the privileges of the rule owner, not the user invoking the rule." - но это касается только relations но не функций, у них своя проверка на права.

есть некоторое подозрение что "Хотим, чтобы пользователь srv_dc мог обращаться к test_view.view_v, но не мог вызывать test_func.func() напрямую" можно сделать только так как вы сделали...

ps: а от кого должна запускаться функция test_func.func при вызове ее пользователем srv_dc через view test_view.view_v ?
от srv_dc ? от postgres?
15 июл 20, 10:24    [22167591]     Ответить | Цитировать Сообщить модератору
 Re: Логика прав на функции внутри view  [new]
Dany305
Member

Откуда:
Сообщений: 99
Maxim Boguk
Dany305,

почитать естественно в документации https://www.postgresql.org/docs/9.4/rules-privileges.html
"Relations that are used due to rules get checked against the privileges of the rule owner, not the user invoking the rule." - но это касается только relations но не функций, у них своя проверка на права.

ну хорошо, про relations что-то есть, хотя и маловато, а про функции где?

есть некоторое подозрение что "Хотим, чтобы пользователь srv_dc мог обращаться к test_view.view_v, но не мог вызывать test_func.func() напрямую" можно сделать только так как вы сделали...

да, кажется только так, но выглядит странновато - execute есть, а usage нет

ps: а от кого должна запускаться функция test_func.func при вызове ее пользователем srv_dc через view test_view.view_v ?
от srv_dc ? от postgres?

я не написал, но предполагается, что функция test_func.func security definer, т.е. от ее владельца - postgres
15 июл 20, 18:26    [22168093]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить