@Gish

Права доступа к разделам меню на чистом PHP?

Доброго времени суток.

Есть меню, в нем разделы и подразделы. Имеет такой вид:
item = пункт
Пункт 1
Пункт 2
Пункт 3
    Пункт 3.1
    Пункт 3.2.
    Пункт 3.3.
Пункт 4
Пункт...
Пункт 15

Есть группы пользователей.
Group1 = user_1, user_2, user_3, user_4
Group2 = user_5,user_6,user_7
Gropu3 = user_8,user_9

Задача:
Выводить для каждой группы пользователей свои пункты меню, при этом для некоторых пользователей выбранной группы могут быть скрыты некоторые меню или подменю. Или меню скрыто для всех, кроме одного юзера. Или открыто для одной группы и для одного юзера из другой группы.

Например.
Нужно открыть "пункт 3" для всей "Group1", кроме "user_4" и открыть только для "user_7" из "Group2"
Получается, access for item_3: (Group1)-(user_4)+(user_7)

Даже если следовать по такому принципу ↑, то делать такие проверки if inarray для каждого подпункта (а их может быть и 15 и 30) - большая нагрузка на серв.... делать гигантское дерево if..else, когда юзеров может быть 10, а может и 1000, как и групп тоже может быть 10-30 тоже не правильно.

Примерно то понимаю, что нужно сделать в бд таблицу, из нее выводить данные, сохранить их где-нибудь в сессии или куке и обращаться уже не к бд, а к этому файлу от конкретного пользователя, и смотреть его права доступа, но не соображу, как сделать вот такие условия

\"Нужно открыть "меню 1" для всей "Group1", коме "user_4" и открыть только для "user_7" из "Group2"\"

Кто понял, есть мысли?
  • Вопрос задан
  • 89 просмотров
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
Условие неполно. Что приоритетнее - наличие в группе или индивидуальные права? Что будет, если вы дали пользователю права на пункт меню, потом дали эти права всей его группе, потом отобрали у всей группы?
Так-то две таблицы: права групп и права пользователей - и суммирование того и другого для конкретного пользователя, принадлежащего конкретным группам. Но это может давать не тот результат, который нужен, если говорится о скрытии для конкретного юзера, невзирая на ту группу, в которую он входит.
Может быть и так, что права группы передаются пользователю только при включении его в эту группу, но дальше играют роль только его права, даже если у группы они изменились.
Или права не бинарны, а "доступ - нет - запрет", и суммирование более сложно.
Вариантов многовато, и без понимания, что именно требуется, правильный не выбрать.
Ответ написан
Комментировать
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Из того, что понял.
1. Есть два типа конечных объектов ("листья"): юзер и пункт меню.
2. У них есть группы ("узлы"): группа пользователей и родительский пункт меню.
3. Вложенность групп - неограничена, "листья" - не имеют вложенности.
4. Есть указание доступа одного из этих 4-х типов объектов к другому из этих 4-х типов объектов.
5. Приоритет "маски": главнее, та, что ближе к "листу" или, наоборот, та, которая ближе к "корню".
6. Составляется бинарная "маска" свойств отображения/доступов для каждого из 4-х типов объектов и затем делается операция XOR для того, чтобы определить совпадение необходимых прав на доступ по всему "дереву" объекта запросившего доступ и по всему "дереву" объекта, доступ к которому был запрошен.
7. Если нет возражений (все нужные биты равны 0-лю) - доступ предоставляется. Иначе - нет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы