Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как правильно получить права пользователя/роли к конкретной таблице/процедуре? / 25 сообщений из 31, страница 1 из 2
23.03.2017, 22:28
    #39426116
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Доброе время суток,

получить права надо для проверки возможности доступа, изменения итп до обращения к таблице или процедуре. Чёт никак не найду в доке. Направьте.

Спасибо.
...
Рейтинг: 0 / 0
23.03.2017, 22:31
    #39426117
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Препарируешь нужный запрос, ловишь ошибку недостачи прав.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.03.2017, 22:39
    #39426125
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Dimitry SibiryakovПрепарируешь нужный запрос, ловишь ошибку недостачи прав.
когда доходит до запроса предполагается что уже какое то действие на клиенте уже произведено (напр. заполнена маска и данные в запросе посланы). Хотелось бы просто не дать открыть такую маску.
...
Рейтинг: 0 / 0
23.03.2017, 22:42
    #39426126
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Mikhail Tchervonenko,

а где искал. Попробуй в описании системных таблиц.
...
Рейтинг: 0 / 0
23.03.2017, 22:46
    #39426127
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Симонов ДенисMikhail Tchervonenko,

а где искал. Попробуй в описании системных таблиц.

я так понимаю, напрямую из таблиц безопасности, простым запросом, получить нельзя т.к. даже SYSADBA доступа к ним напрямую не имеет. Должна быть какая то команда.
...
Рейтинг: 0 / 0
23.03.2017, 22:54
    #39426129
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
вот походу
RDB$USER_PRIVILEGES
...
Рейтинг: 0 / 0
23.03.2017, 23:04
    #39426133
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Mikhail Tchervonenkoкогда доходит до запроса предполагается что уже какое то действие на клиенте уже произведено

Ты эта... почувствуй разницу между выполнением запроса и его препарированием.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.03.2017, 23:09
    #39426134
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Dimitry SibiryakovMikhail Tchervonenkoкогда доходит до запроса предполагается что уже какое то действие на клиенте уже произведено

Ты эта... почувствуй разницу между выполнением запроса и его препарированием.
я знаю эту разницу :), но хочется правильно
...
Рейтинг: 0 / 0
23.03.2017, 23:17
    #39426138
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Mikhail Tchervonenko,

если ты про таблицы SEC$ то в них права не хранятся, там только отображение сведений о пользователях, да и вообще это виртуальные таблицы. А права за исключением CREATE DATABASE хранятся в самой БД в таблице RDB$USER_PRIVILEGES
...
Рейтинг: 0 / 0
23.03.2017, 23:35
    #39426146
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Симонов ДенисMikhail Tchervonenko,

если ты про таблицы SEC$ то в них права не хранятся, там только отображение сведений о пользователях, да и вообще это виртуальные таблицы. А права за исключением CREATE DATABASE хранятся в самой БД в таблице RDB$USER_PRIVILEGES
да, уже разобрался, вот уже наваял но ещё не проверил


Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
create or alter procedure SYSTEM_GET_ACCESS_RIGHTS (
   RELATION_NAME TYPE of COLUMN RDB$USER_PRIVILEGES.RDB$RELATION_NAME,
   OBJECT_TYPE TYPE of COLUMN RDB$USER_PRIVILEGES.RDB$OBJECT_TYPE default 0,
   FIELD_NAME TYPE of COLUMN RDB$USER_PRIVILEGES.RDB$FIELD_NAME default NULL,
   USER_NAME TYPE of COLUMN RDB$USER_PRIVILEGES.RDB$USER default NULL
)
returns
(
  PRIVILEGE CHAR(6)
)
as
begin
/*
RELATION_NAME: Имя объекта (таблица, роль, процедура) на который предоставляется полномочие.

OBJECT_TYPE: Идентифицирует тип объекта, к которому предоставляется привилегия:
• 0 – таблица;
• 1 – представление;
• 2 – триггер;
• 5 – процедура;
• 7 – исключение;
• 8 – пользователь;
• 9 – домен;
• 11 – набор символов;
• 13 – роль;
• 14 – генератор
(последовательность);
• 15 – функция;
• 16 – BLOB фильтр;
• 17 – сортировка;
• 18 – пакет.

PRIVILEGE: Привилегия, предоставляемая в полномочии
• A – all (все привилегии);
• S – select (выборка данных);
• I – insert (добавление данных);
• U – update (изменение данных);
• D – delete (удаление строк);
• R – reference (внешний ключ);
• X – execute (выполнение);
• G – usage (использование);
• M – membership (членство).
*/

 if (USER_NAME is NULL or (Trim(USER_NAME) = '') ) then
     USER_NAME = CURRENT_USER;

 SELECT RDB$PRIVILEGE FROM RDB$USER_PRIVILEGES
 WHERE  RDB$USER = :USER_NAME
 AND RDB$RELATION_NAME = :RELATION_NAME
 AND RDB$FIELD_NAME is NULL or (RDB$FIELD_NAME = :FIELD_NAME)
 AND RDB$OBJECT_TYPE = :OBJECT_TYPE
 into :PRIVILEGE;

 suspend;
end^

...
Рейтинг: 0 / 0
23.03.2017, 23:40
    #39426147
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Mikhail Tchervonenkoя так понимаю, напрямую из таблиц безопасности, простым запросом, получить нельзяПростым - нет, права могут быть даны опосредованно.
Mikhail Tchervonenkoт.к. даже SYSADBA доступа к ним напрямую не имеетЧитать - можно.
Но не нужно.

Препарируй запрос, как уже посоветовали. Да хоть на старте программы.
...
Рейтинг: 0 / 0
23.03.2017, 23:50
    #39426150
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
hvlad,

зачем препарировать, если к таблице надо выяснить права доступа то что бы выяснить все нужные надо препарировать несколько запросов (select, update, insert ....) а из RDB$USER_PRIVILEGES можно получить всё одним запросом. или проблема в том что на чтение RDB$USER_PRIVILEGES привилегию имеет только SYSDBA и дать на неё привилегию чтения всем плохая или невозможная идея?
...
Рейтинг: 0 / 0
24.03.2017, 00:02
    #39426154
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Mikhail Tchervonenkoесли к таблице надо выяснить права доступа то что бы выяснить все нужные надо
препарировать несколько запросов (select, update, insert ....)
А ты хочешь собрать вместе права текущего пользователя, текущей роли, всех ролей,
грантованных этой роли, а до кучи ещё и PUBLIC-а всего одним запросом?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.03.2017, 00:04
    #39426155
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Mikhail Tchervonenko,

проверил, читать может любой успешно вошедший. Соотв встаёт вопрс почему через препарирование а не как по идее правильно. Скорость?
...
Рейтинг: 0 / 0
24.03.2017, 00:06
    #39426156
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Dimitry SibiryakovMikhail Tchervonenkoесли к таблице надо выяснить права доступа то что бы выяснить все нужные надо
препарировать несколько запросов (select, update, insert ....)
А ты хочешь собрать вместе права текущего пользователя, текущей роли, всех ролей,
грантованных этой роли, а до кучи ещё и PUBLIC-а всего одним запросом?..
только для определённого объекта (таблицы/процедуры/... ) дабы выяснить максимально возможные и соотв. построить интерфейс в форме (скрыть что недоступно).
...
Рейтинг: 0 / 0
24.03.2017, 00:10
    #39426159
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Mikhail Tchervonenkoтолько для определённого объекта
Права на определённый объект могут быть выданы всему вышеперечисленному и ещё другим
объектам. То, что они не выданы пользователю прямо, ещё не значит, что он не может объект
использовать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
24.03.2017, 00:39
    #39426167
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Mikhail Tchervonenkoдабы выяснить максимально возможные и соотв. построить интерфейс в форме (скрыть что недоступно).Не нужно полномочия прикладного уровня заменять SQL полномочиями.
Это не работает нигде, кроме hello world.
...
Рейтинг: 0 / 0
24.03.2017, 00:45
    #39426169
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Dimitry SibiryakovMikhail Tchervonenkoтолько для определённого объекта
Права на определённый объект могут быть выданы всему вышеперечисленному и ещё другим
объектам. То, что они не выданы пользователю прямо, ещё не значит, что он не может объект
использовать.
согласен, но у меня частный случай, я раздаю привилегии только через роли, потому такой код будет работать
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
create or alter procedure SYSTEM_GET_ACCESS_RIGHTS (
   RELATION_NAME TYPE of COLUMN RDB$USER_PRIVILEGES.RDB$RELATION_NAME,
   OBJECT_TYPE TYPE of COLUMN RDB$USER_PRIVILEGES.RDB$OBJECT_TYPE default 0,
   FIELD_NAME TYPE of COLUMN RDB$USER_PRIVILEGES.RDB$FIELD_NAME default NULL,
   USER_NAME TYPE of COLUMN RDB$USER_PRIVILEGES.RDB$USER default NULL
)
returns
(
  PRIVILEGE CHAR(6)
)
as
begin
/*
RELATION_NAME: Имя объекта (таблица, роль, процедура) на который предоставляется полномочие.

OBJECT_TYPE: Идентифицирует тип объекта, к которому предоставляется привилегия:
• 0 – таблица;
• 1 – представление;
• 2 – триггер;
• 5 – процедура;
• 7 – исключение;
• 8 – пользователь;
• 9 – домен;
• 11 – набор символов;
• 13 – роль;
• 14 – генератор
(последовательность);
• 15 – функция;
• 16 – BLOB фильтр;
• 17 – сортировка;
• 18 – пакет.

PRIVILEGE: Привилегия, предоставляемая в полномочии
• A – all (все привилегии);
• S – select (выборка данных);
• I – insert (добавление данных);
• U – update (изменение данных);
• D – delete (удаление строк);
• R – reference (внешний ключ);
• X – execute (выполнение);
• G – usage (использование);
• M – membership (членство).
*/

 if (USER_NAME is NULL or (Trim(USER_NAME) = '') ) then
     USER_NAME = CURRENT_ROLE;
 for
 SELECT RDB$PRIVILEGE FROM RDB$USER_PRIVILEGES
 WHERE  RDB$USER = :USER_NAME
 AND RDB$RELATION_NAME = :RELATION_NAME
 AND RDB$FIELD_NAME is NULL or (RDB$FIELD_NAME = :FIELD_NAME)
 AND RDB$OBJECT_TYPE = :OBJECT_TYPE
 into :PRIVILEGE
 do
 begin
    suspend;
 end
end^


проверил, работает как в моём случае как мне нужно. Если параметр пользователь оставить пустым или передать в него не пользователя а роль. Можно конечно усложнить и пройтись по правам роли на основе переданного пользователя но мне в данном проекте это уже не нужно думаю. Ходя может завтра допишу на всякий случай.

Всем спокойной ночи и спасибо за участие.
...
Рейтинг: 0 / 0
24.03.2017, 00:50
    #39426171
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
hvladMikhail Tchervonenkoдабы выяснить максимально возможные и соотв. построить интерфейс в форме (скрыть что недоступно).Не нужно полномочия прикладного уровня заменять SQL полномочиями.
Это не работает нигде, кроме hello world.
пока не вижу никаких тому противопоказаний. Если база выстроена правильно то её безопасность вполне может отвечать логике доступа на уровне форм.
...
Рейтинг: 0 / 0
24.03.2017, 12:14
    #39426447
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
hvlad,


единственное неудобство что при входе пользователем надо указывать его роль. Есть какая то возможность назначать роль по умолчанию для пользователя? дабы при входе без указания роли бралась какая то назначенная по умолчанию?
...
Рейтинг: 0 / 0
24.03.2017, 12:18
    #39426451
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Mikhail Tchervonenko,

в 4.0 есть роли по умолчанию. Их права суммируются. Короче они что-то вроде групп. В 3.0 только хаками. Я один такой придумал, достаточно в ON CONNECT триггере выполнить SET ROLE через EXECUTE STATEMENT
...
Рейтинг: 0 / 0
24.03.2017, 12:25
    #39426454
Mikhail Tchervonenko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Симонов ДенисMikhail Tchervonenko,

в 4.0 есть роли по умолчанию. Их права суммируются. Короче они что-то вроде групп. В 3.0 только хаками. Я один такой придумал, достаточно в ON CONNECT триггере выполнить SET ROLE через EXECUTE STATEMENT

спасибо за идею,

я предполагал для всех пользователей вход по какой то минимальной по правам роли и потом делать SET ROLE,
но через ON CONNECT выглядит ещё лучше.
...
Рейтинг: 0 / 0
24.03.2017, 12:26
    #39426455
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Mikhail Tchervonenkoединственное неудобство что при входе пользователем надо указывать его роль.Чтим стандарт.
...
Рейтинг: 0 / 0
24.03.2017, 12:27
    #39426456
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
Симонов ДенисЯ один такой придумал, достаточно в ON CONNECT триггере выполнить SET ROLE через EXECUTE STATEMENTХацкер :)

SQL роли не являются группами прав !
Они являются ролью приложения , потому и определяются приложением.
...
Рейтинг: 0 / 0
24.03.2017, 12:30
    #39426461
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно получить права пользователя/роли к конкретной таблице/процедуре?
hvlad,

до Таблоида по части хитрых рецептов я ещё не дорос :)
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как правильно получить права пользователя/роли к конкретной таблице/процедуре? / 25 сообщений из 31, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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