powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как организовать права доступа к сущностям в БД?
7 сообщений из 7, страница 1 из 1
Как организовать права доступа к сущностям в БД?
    #39561295
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Я делаю информационную систему, в ней различные объекты (документы, ТМЦ и др.). И к отдельным сущностям необходимо разграничивать доступ. Т.е. что user1 имеет право доступа к документу, а user2 не имеет.

У меня в данный момент это реализовано таким образом:
Код: 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.
//Документы
Table DOC (
   id         SERIAL,
   name       CHAR(10)
)

//Пользователи
Table USERS (
   id         SERIAL,
   name       CHAR(10)
)

//Группы пользователей
Table GROUPS (
    id        SERIAL,
    name      CHAR(10)
)

//Состав групп пользователей
Table USER_GROUP (
    id        SERIAL,
    userID    BIGINT UNSIGNED NOT NULL,
    groupID   BIGINT UNSIGNED NOT NULL,
    UK (userID, groupID),
    FK userID -> USERS(id),
    FK groupID -> GROUPS(id)
)

//Доступ к док-ам группам пользователей
Table DOC_GROUP_ACC(
    id        SERIAL,
    docID     BIGINT UNSIGNED NOT NULL,
    groupID   BIGINT UNSIGNED NOT NULL,
    UK (docID, groupID),
    FK docID -> DOCS(id),
    FK groupID -> GROUPS(id)
)

//Доступ к док-ам отдельным пользователям
Table DOC_USER_ACC(
    id        SERIAL,
    docID     BIGINT UNSIGNED NOT NULL,
    userID    BIGINT UNSIGNED NOT NULL,
    UK (docID, userID),
    FK docID -> DOCS(id),
    FK userID -> USERS(id)
)



и соответственно в запросах получения списка документов используются конструкции вида
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
.... WHERE docID IN (
    SELECT   docID 
    FROM      DOC_USER_ACC
    WHERE   userID=${ID текущего пользователя}
  UNION ALL
   SELECT    docID
   FROM      DOC_GROUP_ACC
   WHERE   groupID IN (${набор групп текущего пользователя})
)



Собственно вопрос по этой схеме:
Жизнеспособна ли такая схема и насколько по производительности это приемлемое решение?
Объёмы: Пользователей 100-200
Групп: 10-20
Документов: пусть будет 10 млн.

Спасибо!
...
Рейтинг: 0 / 0
Как организовать права доступа к сущностям в БД?
    #39561615
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да хреновая схема. Это у тебя на каждый чих будет кэшиться на диск подзапрос на лям DocID-ов. Вводи таблицы прав в запрос как полноправные источники данных - если всё же охота вот так, через то самое место. А по уму - пиши функцию, которая примет юзера и док, и вернёт, есть права или нет. И её в секцию отбора.
...
Рейтинг: 0 / 0
Как организовать права доступа к сущностям в БД?
    #39561647
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina , спасибо за пояснения.

А вводить в запрос как полноценные источники данных, это стало быть JOIN'ить просто с доками?
А писать функцию, если в этой функции будет выполняться тот же самый вариант запроса (который в моём посте - подзапрос) это будет менее прожорливым вариантом?
...
Рейтинг: 0 / 0
Как организовать права доступа к сущностям в БД?
    #39561866
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не этот же самый, по конкретному DocID. Да и запрашиваться будет просто количество (а то и вообще факт наличия), а не сами ИДы. При наличии правильного индекса - взлетит.
...
Рейтинг: 0 / 0
Как организовать права доступа к сущностям в БД?
    #39562512
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina , т.е. это будет что-то типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SElECT * FROM DOCS WHERE checkDocAccess(docID)=1 
FUNCTION checkDocAccess(docID BIGINT) RETURNS TINYINT
BEGIN
   SELECT 1 
   FROM   DOC_USERS 
   WHERE docID=docID 
      AND   userID=${ТЕКУЩИЙ userID};
   IF ... RETURN 1 ELSE RETURN 0;
END

?
...
Рейтинг: 0 / 0
Как организовать права доступа к сущностям в БД?
    #39562865
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да проще - SELECT COUNT, и его сразу возвращать.
...
Рейтинг: 0 / 0
Как организовать права доступа к сущностям в БД?
    #39563488
kormot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina , так и сделал в итоге. Через функцию, всё работает, спасибо!

А вообще в серьёзных приложениях (на несерьёзной СУБД типа MySQL) как реализуется такая задача? Тоже в виде таблиц с списком пользователей/групп у объекта и проверкой функцией на вхождение текущего пользователя в эти списки?
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как организовать права доступа к сущностям в БД?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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