Система контроля доступа PHP

Я являюсь частью команды, создающей веб-приложение с использованием PHP и MySQL. В приложении будет несколько пользователей с разными ролями. Приложение также будет использоваться географически распределенным образом. Соответственно, нам необходимо создать систему контроля доступа, работающую на следующих двух уровнях:

  1. Управляет разрешениями пользователей для определенных страниц php, то есть предоставляет или запрещает доступ к определенным страницам (или элементам пользовательского интерфейса) в зависимости от роли пользователя. Например: пользователю может быть разрешен доступ к странице «Студенты», но не к странице «Учителя».
  2. Управляет разрешениями пользователей для определенных записей базы данных, т. Е. Изменяет запросы к базе данных, чтобы отображались только определенные записи. Например, для пользователя на уровне города должны отображаться только те записи, которые относятся к конкретному городу пользователя, а для пользователя на национальном уровне должны отображаться записи для ВСЕХ ГОРОДОВ в стране.

Мне нужна помощь в разработке системы, которая может обрабатывать оба этих типа контроля доступа. Пункт № 1 кажется достаточно простым. Однако я совершенно не понимаю, как выполнить пункт 2 без жесткого кодирования информации в запросах SQL.

Любая помощь будет оценена по достоинству.

заранее спасибо

Винаяк

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
8
0
8 024
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Не знаю деталей вашей проблемы, но Zend Framework имеет довольно мощный набор компонентов ACL и AUTH, на которые вы, возможно, захотите взглянуть. Хорошие вещи, такие как очень точный контроль доступа, постоянное хранение данных, расширенные условные правила.

Мне кажется, что вам нужно следующее: (я буду использовать пример страны / штата / города)

  1. Список всех стран. У каждой «страны» есть идентификатор.
  2. Список всех штатов внутри стран. Каждое состояние привязано к идентификатору страны, но также имеет свой собственный уникальный идентификатор.
  3. Список всех городов. Каждый город связан либо со штатом, либо напрямую со страной, и имеет флаг, указывающий, какой именно.

Для городского пользователя, очевидно, искать и отображать только те записи, которые относятся к городу, который соответствует их идентификатору. Однако для уровня штата или страны найдите все записи, относящиеся к каждому городу, идентификатор которого соответствует этой нации (или штату, или какому-либо другому).

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

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

Vinayak 23.10.2008 17:58

@ vinayak.myopenid.com, вам все равно придется использовать другой запрос, если вы позволите серверу SQL знать, какой у вас уровень доступа. Похоже, что разрешения будут обрабатываться путем привязки выражений в предложении WHERE к AND. Звучит довольно просто.

strager 28.11.2008 08:14

Если вы не знаете, как это сделать, я бы использовал PHP-фреймворк, например Zend Framework, CakePHP или Symfony. Они сделали за вас всю тяжелую работу и уже имеют какую-то схему контроля доступа.

Ответ принят как подходящий

Несколько месяцев назад я был в похожей ситуации. Я обнаружил, что такие инструменты, как Zend_ACL, отлично работают, если вы просто проверяете уровень доступа к одному элементу (или достаточно небольшому их количеству). Он не работает, когда вам нужно получить огромный список элементов, к которым пользователю разрешен доступ. Я разработал собственное решение этой проблемы, используя шаблон Бизнес-делегат. BD предоставляет бизнес-логику, которую можно применять в конкретном контексте. В этом сценарии была доставлена ​​логика SQL, которая использовалась в качестве условия фильтрации в подзапросе. См. Следующие схемы:

alt text
(source: epsi.pl)

И диаграмма последовательности, показывающая порядок звонков:

alt text
(source: epsi.pl)

Я писал об этом решении, к сожалению, все это на польском языке, но вы можете найти фрагменты кода и диаграммы под рукой. Что я могу сказать, реализация - это не кусок пирога, но с точки зрения производительности это чемпион по сравнению с итеративной проверкой доступа для каждого элемента в списке. Более того, указанная выше инфраструктура обрабатывает не только один тип элементов в списке. Он может использоваться при доступе к различным спискам, будь то список городов, стран, продуктов или документов, если элементы в списке реализуют интерфейс IAuthorizable.

Привет, я знаю, что это старый ответ, но мне просто нужно пояснить Диаграмма классов UML, что означают разные типы стрелок? (Сплошные, пунктирные и серые)

Tristian 06.02.2011 08:30

@Triztian - сплошные со стрелками - это вызовы методов, пунктирные вертикальные линии представляют собой линии жизни, а пунктирные горизонтальные линии часто представляют собой возврат.

Ryan S 05.08.2011 17:30

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

Я искал кого-то, кто уже реализовал решение, но, похоже, никто этого не сделал. Будем надеяться, что не удастся :)

Другие вопросы по теме