Реализация RBAC в Yii

А вы отбросьте эмоции. И поясните, о каких фильтрах вы говорите, если у нас нет запрещающих утверждений? Вот есть у меня с десяток разных опрераций, связанных разрешающим утверждением с разными ролями. И как мне поможет одна задача-фильтр с "специальным конструктором" (в чем суть "специальности"?) в проблеме установить это правило как ограничитель на любую из вышеупомянутых операций? Как это будет выглядеть в интерфейсе?

Приведите пример реализации "общих фильтров".

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

Читал дискуссию несколько раз, читал вдумчиво, копал код HRBAC расширения, читал про Zend_ACL (намек на то, что я сначала думал ;))

Чего я не делал - я не копал глубоко Yii-native RBAC

У меня сейчас стоит задача создания системы со сложным разветвленным контролем доступа. А роли, задачи и операции будут проясняться по ходу разработки и эксплуатации. Это CRM-система. Именно этим вызван мой интерес к крутой систему управления доступом, которая может все ;)

Резюмируя все что изложено выше:

  1. Yii-native реализация не позволяет определить иерархию ролей. Другими словами, роли нельзя назначить роль так же как задачу или операцию.

  2. В Yii RBAC нельзя применить разнознаковые правила.

Спецификацию по RBAC я просмотрел, но возможности назначит правило со знаком "минус" тоже не нашел. Читал вот это: http://csrc.nist.gov/groups/SNS/rbac/documents/draft-rbac-implementation-std-v01.pdf отсюда: http://csrc.nist.gov/groups/SNS/rbac/resources.html

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

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

В любом случае, имея и наследование и бизрулы и разнознаковые правила, можно посторить систему гораздо более гибкую, чем с текущим RBAC

По поводу качества кода в HRBAC я согласен с creocoder, не фонтан. Я сначала думал допилить это расширение, но думаю что делать этого не буду, потому что в нем есть куча ненужного мне функционала, как, например, кондишены. Зачем - не знаю, но глючит не по-детски.

Очень понравились идеи из этого расширения:

  1. Наследование через простое включение роли в другую роль

  2. Возможность автоматической рповерки доступа по пути (/module/controller/action) Это очень удобно.

  3. computedRoles. Это возможность сгенерить роли для текущего залогиненного юзера в текущем контексте. Так может решаться проблема editOwnPost при условии что в коде соответствующего экшена ничего не пишется.

Если сюда добавить:

  1. разнознаковые правила

  2. возможность разначения нескольких бизрулов на одно отношение и определение их приоритета

То получается (с моей точки зрения) идеальная, мощная и гибкая система управления правами.

Я смотрел код CDbAuthManager. Это намного лучше, чем HRBAC, но строчки типа такого:


if(count($names)<4)

	$condition='name='.implode(' OR name=',$names);

else

	$condition='name IN ('.implode(', ',$names).')';

Немного удивляют :) Радует что такого мало - только это и SQL-запрос со странным именованием полей.

Мне для проекта нужна такая штука, да и вообще хотелось бы такое использовать у себя. Поэтому наверное буду программить, если вот это: http://www.openrbac.de/en_startup.xml меня не устроит. Что можете сказать по поводу описаного функцинала? Этого достаточно или надо что-то еще? Какие есть замечания?

creocoder, я понимаю, что все задачи могут быть решены с помощью нативного RBAC, но, согласитесь, с некоторыми улучшениями это решается гораздо красивее :) Поэтому я бы хотел увидеть конструктивную критику и такие же предложения.

KJedi

Неверные выводы.

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

А логическими операциями обойтись не выйдет? A && B || C.

Если пойти чуть дальше и запостить тикет с описанием проблемы и её возможным решением — есть немалый шанс получить нужный код в ядре.