powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / разграничение досупа к информации или как сделать такую ф-ю
6 сообщений из 6, страница 1 из 1
разграничение досупа к информации или как сделать такую ф-ю
    #34045738
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
встал вопрос о разграничении прав доступа к информации
решил реализовать это так:
1. имеется табличка с пользователями ( user_list )
- user_id
- user_login
- user_name
- session_key

когда пользователь логинится в системе, то он получает сгенерированный session_key, и в дальнейшем, кидает user_id & session_key в качетве параметров во всех запросах

2. есть табличка с данными доступ к которым надо разграничивать, среди столбцов с данными ( data_list ), в ней есть два поля
- maker_id - это user_id пользователя - который создал эту запись
- access_list - список user_id, которые могут смотреть эту запись в виде ";2;11;14;15;16"

3. когда пользователь делает запрос, то сперва проверятеся соответствие user_id и session_key на корректность, и только потом делается запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
 функция GET_DATA_LIST (_user_id int4, _session_key varchar)
   DECLARE f INTEGER;

   SELECT count(user_id) INTO f
   FROM user_list
   WHERE user_id = _user_id AND session_key = _session_key;

   IF f =  1  THEN
      SELECT * FROM data_list 
      WHERE maker_id = _user_id
      OR  access_list LIKE '%;'||_user_id||';%'
   END IF

В принципе, схема работоспособнася, но когда начал проверять от имени пользователей (на админа), то возникла БОЛЬШАЯ проблемма
по идее пользователь должен иметь доступ к GET_DATA_LIST
а GET_DATA_LIST - должна иметь доступ к user_list и data_list

но как оказалось, функция выполняется с правами пользователя который её вызывает
то есть, чтобы отработала вышеописанная функция у пользователя как минимум должны быть SELECT права на user_list и data_list
всё это теряет смысл, если юзер напрямую имеет доступ к этим таблицам

вроде это могут победить вьюхи, но к ним нельзя передать параметра, или можно?
как это обойти?
...
Рейтинг: 0 / 0
разграничение досупа к информации или как сделать такую ф-ю
    #34045846
DeWiL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CREATE FUNCTION ... SECURITY DEFINER ?
...
Рейтинг: 0 / 0
разграничение досупа к информации или как сделать такую ф-ю
    #34047669
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, это то, что надо!!! Спасибо
...
Рейтинг: 0 / 0
разграничение досупа к информации или как сделать такую ф-ю
    #34048650
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если к базе полный доступ ( типа она под вашем контролем, а не хостинг какойто ) то, помойму, лучше дать пользователям полноценные дб аккаунты.
И сделать проверку доступа к строкам таблиц через представления. И пользователям дать доступ к представлениям как к обыкновенным таблицам - программа на клиенте упроститься.
И зачем еще какойто ссесион кей придумали? У вас что, в разных ссессиях но для одного пользователя могут быть разные права?
...
Рейтинг: 0 / 0
разграничение досупа к информации или как сделать такую ф-ю
    #34050356
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JelisЕсли к базе полный доступ ( типа она под вашем контролем, а не хостинг какойто ) то, помойму, лучше дать пользователям полноценные дб аккаунты.
И сделать проверку доступа к строкам таблиц через представления. И пользователям дать доступ к представлениям как к обыкновенным таблицам - программа на клиенте упроститься.
База в локальной сети
У каждого пользователя будет свой индивидуальный аккоунт
Помимо этого есть дополнительная таблица ( user_list ) с фамилиями, отделами, логинами, группами пользователей + морда для оправления пользователями.
Если я делаю проверку через представление, то во въюхе можно проверить по имени пользователя (USER). Получается надо для каждой строки хранить список пользователей по именам. а если 10 столбцов с данными, ещё два с именем "создателя" и "списком кому можно смотреть"... выходит будет в полтора раза больше данных, что скажется на быстродействии.
На сколько я знаю хранить и обрабатывать циферки гараздо быстрее.
Вот и было решено хранить не имена а user_id из user_list

JelisИ зачем еще какойто ссесион кей придумали? У вас что, в разных ссессиях но для одного пользователя могут быть разные права?
Если использовать вышеуказанную функцию без session_key, то любому другому пользователю, будет достаточно подставить в запрос другой user_id и получить доступ к любым данным в data_list .
При подключении пользователя к БД, генерится session_key (md5) и его помнит клиент и база данных. - так я хочу разграничивать доступ к данным

а права групп и пользователей будут нужны при реализации "бизнес процессов"

Может можно как-то проще?

Буду рад подсказкам!
...
Рейтинг: 0 / 0
разграничение досупа к информации или как сделать такую ф-ю
    #34054133
Jelis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Данные о правах доступа можно хранить в отдельной таблице (persmisson), например с такими полями
название таблицы
ид_поле в таблице к которому ограничеваеться доступ
название столбца ( если нужно еще и ограничение по столбцам...
хотя тогда лучше таблицу на две разбить, imho)
логин пользователя ( или ид, наверно ид в самом деле лучше, тем более что у вас буде дополнительная таблица по пользователям )

а в представленние делать еще такую проверку
AND id IN (SELECT p.id FROM Permission AS p
WHERE login = current_user AND table_name = 'our_table');

И все это конечно оптимизировать-нормализировать :-) А в основной таблице вообще убрать любые данные о доступе и доступ к ним простым смертным закрыть.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / разграничение досупа к информации или как сделать такую ф-ю
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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