Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как организовать права доступа к сущностям в БД? / 7 сообщений из 7, страница 1 из 1
29.11.2017, 14:40
    #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
29.11.2017, 21:29
    #39561615
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать права доступа к сущностям в БД?
Да хреновая схема. Это у тебя на каждый чих будет кэшиться на диск подзапрос на лям DocID-ов. Вводи таблицы прав в запрос как полноправные источники данных - если всё же охота вот так, через то самое место. А по уму - пиши функцию, которая примет юзера и док, и вернёт, есть права или нет. И её в секцию отбора.
...
Рейтинг: 0 / 0
29.11.2017, 23:35
    #39561647
kormot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать права доступа к сущностям в БД?
Akina , спасибо за пояснения.

А вводить в запрос как полноценные источники данных, это стало быть JOIN'ить просто с доками?
А писать функцию, если в этой функции будет выполняться тот же самый вариант запроса (который в моём посте - подзапрос) это будет менее прожорливым вариантом?
...
Рейтинг: 0 / 0
30.11.2017, 12:08
    #39561866
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать права доступа к сущностям в БД?
Не этот же самый, по конкретному DocID. Да и запрашиваться будет просто количество (а то и вообще факт наличия), а не сами ИДы. При наличии правильного индекса - взлетит.
...
Рейтинг: 0 / 0
01.12.2017, 13:12
    #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
01.12.2017, 21:36
    #39562865
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать права доступа к сущностям в БД?
Да проще - SELECT COUNT, и его сразу возвращать.
...
Рейтинг: 0 / 0
04.12.2017, 10:24
    #39563488
kormot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как организовать права доступа к сущностям в БД?
Akina , так и сделал в итоге. Через функцию, всё работает, спасибо!

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


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