Расширяемый шаблон доступа на основе правил - PullRequest
3 голосов
/ 07 ноября 2008

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

Совокупность вещей определяет, будет ли доступ предоставлен или запрещен. И эти правила время от времени меняются.

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

Я задаюсь вопросом, как сделать рефакторинг, чтобы быстро и легко изменить правила. Когда это было просто «если это И это, то доставь, еще 403.» это было нормально делать на простом PHP. Теперь условия стали более сложными, и есть несколько уровней вложенности, каждый из которых имеет общие, но немного отличающиеся друг от друга условия. Это все достаточно просто для рефакторинга, но это не самый интуитивно понятный и простой в обновлении.

Я думаю об одной из двух вещей.

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

  2. Создайте простой движок, который выполняет итерацию двумерного массива упорядоченных правил, вроде правил брандмауэра. Что-то вроде: <allow|deny>, <auth_group>, <path_regex>, <other vars>

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

Что бы вы сделали? Есть ли для этого шаблон или библиотека, которую я могу использовать?

Я столкнулся с подобной проблемой в другом приложении некоторое время назад. Где я хотел легко обновить способ объединения правил и результатов, основанных на нескольких уровнях условий. Это не так сложно, как это приложение, но мне было бы интересно узнать о шаблонах, которые люди используют для решения такого рода проблем.

Ответы [ 3 ]

1 голос
/ 07 ноября 2008

Возможно, вы захотите проверить Zend_Acl , который является объектно-ориентированным PHP-классом для управления иерархиями привилегий в иерархиях ресурсов. Возможно, вы не сможете использовать этот компонент как есть, но он может дать вам некоторое представление о том, как вы хотите реализовать свою собственную систему.

Zend_Acl является частью библиотеки классов Zend Framework PHP 5, но, как и многие классы в ZF, Zend_Acl может использоваться независимо. Нет необходимости использовать остальную часть Zend Framework.

0 голосов
/ 08 мая 2012

Я бы использовал шаблон спецификации . Это позволяет комбинировать правила. Вы даже можете создать класс для представления составного правила, которое будет выполняться (следуя шаблону) в методе IsSatisfiedBy().

0 голосов
/ 07 ноября 2008

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

...