2016-07-10 6 views
0

Я пытаюсь настроить управление доступом в приложении, которое я пишу. Я видел такие подходы, как ACL и Roles/Permission (например, описанные here и многие другие, а также Nested Set Model), но я не уверен, могу ли я выполнить свою цель, используя эти подходы.Контроль доступа в разных таблицах с родительскими/дочерними отношениями

То, что я пытаюсь сделать, это найти способ разрешить доступ к детям объекта. Уловка заключается в том, что дети хранятся в разных таблицах и представляют разные объекты. Пример:

City > Streets (city_id) > Houses (street_id) > People (house_id) 

В этом случае, каждый из этих объектов хранятся в другой таблице в базе данных, и указывает на его родителей с полями в скобках. То, что я хочу сделать, - это предоставить права пользователя только на уровне «Город» (например, разрешения на грант для города № 10), который предоставит доступ ко всем детям на разных таблицах внизу, будь то улица, дом, или человека. (Итак, я могу спросить что-то вроде «Имеет ли пользователь А разрешение на дом № 16?», И система может определить, является ли дом № 16 ребенком/внуком и т. Д. Объекта Город № 10.)

, Я знаю, что это можно сделать, используя несколько соединений и т. Д. В базе данных, но это похоже на подход «грубой силы» и не будет очень сухим или многоразовым. То, что я надеюсь найти, является более эффективным/менее наивным способом достижения этого, если это возможно. Благодаря!

ответ

0

Найдено ответов: Models for Hierarchical Data in SQL and PHP.

Это видео говорит о «закрывающих столах», которое именно то, что я искал. Используя поля «глубина» и «предки» в таблице закрытия, я могу точно определить любой уровень иерархии (Люди, Дома, Улицы), к которым принадлежит город.

Я также создал таблицу «Securables», которая имеет один ряд для каждой строки из таблиц людей, домов и улиц. Тогда моя таблица закрытия (и некоторая конфигурация, чтобы сообщить каждой дочерней таблице, какая должна быть ее глубина) связывает их вместе в дерево. Затем, используя эту настроенную глубину, я могу в любой момент захватить корень дерева Города из любого узла внутри - в одном запросе! Presto!