PHP, MySQL - эффективное определение прав доступа на основе удаленного родителя - PullRequest
0 голосов
/ 06 апреля 2020

Я изо всех сил пытаюсь найти эффективное решение для определения доступа пользователя к указанной папке, используя PHP (в частности Laravel) и MySQL. Я хочу создать систему с функциональностью Google Drive-esque ...

Например, Джо Блоггс создает много папок в папках, например, Level 1 > Level 2 > Level 3 > Level 4 > Level 5. В любой из этих папок может быть любое количество дополнительных вложенных файлов и папок.

Это будет результирующая структура базы данных -

Table name: users

| id | name       |
| -- | ---------- |
| 1  | Joe Bloggs |
| 2  | John Snow  |


Table name: folders

| id | parent_id | author_id | name      |
| -- | --------- | --------- | --------- |
| 1  | NULL      | 1         | Level 1   |
| 2  | 1         | 1         | Level 2   |
| 3  | 2         | 1         | Level 3   |
| 4  | 3         | 1         | Level 4   |
| 5  | 4         | 1         | Level 5   |
| 6  | 2         | 1         | Level 3.1 |
| 7  | 2         | 1         | Level 3.2 |

Table name: folders_users

| id | folder_id | user_id | owner | read | write |
| 1  | 1         | 1       | 1     | 1    | 1     |
| 2  | 3         | 2       | 0     | 1    | 1     |

Таким образом, основываясь на записи 1 в folder_users, Джо Блоггс должен иметь права владельца, чтения и записи для всех папок, находящихся под Level 1. Затем Джо Блоггс предоставляет Джону Сноу право на чтение и запись для Level 3, что, в свою очередь, должно дать Джо Блоггсу право на чтение и запись для Level 3, Level 3.1, Level 3.2 и всего, что будет создано в любом из них в будущем.

Кроме того, пользователь должен иметь возможность пометить папку. Я мог бы предположить, что это может быть просто достигнуто с отдельной таблицей и запросить это отдельно -

Table name: starred_folders

| id | folder_id | user_id |
| -- | --------- | ------- |
| 1  | 7         | 2       |

Текущее решение, которое у меня есть, - для каждой папки в цепочке, к которой у пользователя есть права доступа, создается запись в таблице folders_users. Я чувствую, что это просто усложняет вещи и создает чрезмерное количество записей. Это особенно верно, когда дело доходит до общего доступа к папке, так как я должен воссоздать все дерево для этого одного пользователя. Или представьте, если пользователь отменяет доступ на запись к одному из общих пользователей, все дерево (возможно, сотни записей) необходимо обновить для одного флага.

Каков наилучший способ создания этих деревьев? и быстро и качественно определить уровень доступа пользователя в той или иной папке? Я подозреваю, что единственный способ сделать это - рекурсия, но я обеспокоен ее эффективностью? Или я должен использовать что-то совершенно отличное от MySQL для этого? Я кратко изучил графовые базы данных, но не вижу, чтобы это был путь вперед, поскольку у нас нет инфраструктуры для его поддержки.

Спасибо, Крис.

1 Ответ

0 голосов
/ 06 апреля 2020

Я пишу это как решение, не самое эффективное.

Вы можете добавить столбец в вашу таблицу folders (назовем это access), а затем указать идентификаторы людей, которые имеют доступ к этой папке и ее дочерним элементам. Я предполагаю, что когда вы хотите показать информацию о папке, вы должны также получить информацию о ее родителях из таблицы, чтобы вам не нужно было добавлять новые запросы для этого.
И если у вас просто есть определение доступа, вы можете просто добавить записи в этот столбец, например user1,user2,..., а если нет, то можете сериализовать массив, подобный этому

[
    "read" => [user1,user2,...],
    "write" => [user2]
]

Конечно, вы можете добавить столбец для каждый доступ, но если у вас так много обращений, это тоже может быть решением.

...