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

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

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

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

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

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

Винаяк


person Vinayak    schedule 23.10.2008    source источник


Ответы (5)


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

alt text
(источник: epsi .pl)

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

alt text
(источник: epsi.pl ​​)

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

person Michał Niedźwiedzki    schedule 28.11.2008
comment
Привет, я знаю, что это старый ответ, но мне просто нужны пояснения по диаграмме классов UML , что означают разные типы стрелок? (сплошные, пунктирные и серые) - person Tristian; 06.02.2011
comment
@Triztian - сплошные со стрелками - это вызовы методов, пунктирные вертикальные линии представляют собой линии жизни, а пунктирные горизонтальные линии часто представляют собой возврат. - person Ryan S; 05.08.2011

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

person rg88    schedule 23.10.2008

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

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

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

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

person Nicholas Flynt    schedule 23.10.2008
comment
Привет, но это означает, что поисковые запросы должны быть написаны по-разному для каждого уровня пользователя. Моя проблема состоит в том, чтобы найти способ заставить один и тот же запрос возвращать разный набор результатов в зависимости от уровня пользователя. - person Vinayak; 23.10.2008
comment
@ vinayak.myopenid.com, вам все равно придется использовать другой запрос, если вы должны сообщить серверу SQL, какой у вас уровень доступа. Похоже, что разрешения будут обрабатываться путем привязки выражений в предложении WHERE к AND. Звучит довольно просто. - person strager; 28.11.2008

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

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

person Nikola Petkanski    schedule 24.01.2011

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

person Bryan Waters    schedule 23.10.2008