Powered by CodeIgniter

Разработка

(21)
17
17 голосов
Разработка новой версии cogear. Прямой эфир с места событий.

Некоторые мысли относительно контроля прав в Cogear

Что мы имеем, и как сделать лучше?

На данный момент в движке Cogear существует следующая система контроля прав:

субъект права:[множество пользователей (группа)] -> (право на действие) {объект права зависит от acl-записи}
Такая система проста, но не очень гибка — на каждое действие приходится придумывать отдельное право. Кроме того, на некоторые типы субъектов (к примеру, владельца (автора) публикации или комментария) тоже приходится придумывать отдельные acl, и, более того, реализовывать их поддержку в коде модуля.
Что можно сделать:
Разрешение на действие:
[множество субъектов разрешения] -> (действие) -> [множество объектов разрешения]
Запрет на действие:
[множество субъектов запрета] -> (действие) -> [множество объектов запрет]

Теперь, поясню множества субъектов и объектов:
Множеством субъектов может быть:
  • Все пользователи вообще
  • Все незарегистрированные пользователи
  • Все зарегистрированные пользователи
  • Пользователи, принадлежащие к какой-либо отдельной группе (входит в предыдущее множество)
  • Какой-то конкретный пользователь (входит в предыдущее множество, является множеством из одного элемента)
  • Владелец объекта (входит во множество пользователей в группах, является множеством из одного элемента)

Множеством объектов может быть:
  • Любой объект (запись, комментарий, сообщество,право доступа, etc)
  • Объект конкретного типа (запись, комментарий, сообщество,право доступа, etc)
  • Конкретный объект
  • Дочерний объект конкретного объекта (для сообщества или блога это будет публикация, для публикации — комментарий, для комментария — ответ на комментарий и т.д.)

А, в свою очередь, действия могут быть таковыми:
  • Любое действие
  • Видимость (объект выводится в списке, к примеру запись в дайджесте блога)
  • Просмотр (можно просмотреть, т.е. открыть запись)
  • Редактирование
  • Создание
  • Удаление
  • Оценка
  • Отсутсвие капчи для совершения действия
  • Присвоение (то есть изменение принадлежности на принадлежность конечному субъекту)
В принципе, можно добавить любые типы действий, тем более, что это должно быть предусмотрено моделью, и действие не должно перекрывать уже существующие.

Теперь, про множества пользователей:
Пользователь может быть членом нескольких множеств, к примеру таких, как:
  • Группы, определенные администратором
  • Подписчики какого-либо блога
  • Множество всех модераторов
  • Множество модераторов конкретного блога
  • и т.д.

Наверняка, у вас появился вопрос, зачем так сложно?

А вот зачем: Фишка разрешения комментирования любой записи добавляется так:
разрешение:[множество всех пользователй] (создание) [объект типа комментарий]
Фишка ввода капчи для любого действия для провинившихся:
запрет:[монжество провинившихся] (отсутствие капчи) [множество всех объектов]
Фишка блокировки забаненых:
запрет:[множество забаненых] (любое действие) [множество всех объектов]
Фишка «прострелить себе коленку»:
запрет:[все пользователи вообще] (любое действие) [множество всех объектов]

Обработка на стороне сервера


По умолчанию прав нет. Ни на что.
При запросе (функции передается id пользователя, id и тип объекта, тип дочернего объекта (если есть) и действие, которое должно быть совершено) права доступа происходит следующее:
1. Будет вычеслено в какие множества входить пользователь
2. Будет вычеслен родитель объекта
3. Будет установленно, является ли пользователь владельцем объекта
4. Будет сделан запрос типа
запрет:[все пользователи или {все зарегистрированные} или {множества, в которые входит пользователь} или {владелец?} или пользователь] (действие) [все объекты или объект типа {тип} или {предок} или объект]
Если вернется хотя бы одна запись, доступ будет отклонен
5. Будет сделан запрос типа
разрешени:[все пользователи или {все зарегистрированные} или {множества, в которые входит пользователь} или {владелец?} или пользователь] (действие) [все объекты или объект типа {тип} или {предок} или объект]
Если вернется хотя бы одна запись, доступ будет разрешен.

К сожалению, у этой концепции есть и недостатки: сложность реализации, необходимость правки ВСЕГО кода движка и высокая нагрузка на сервер (в принципе может быть решено за счет кэша). Если подобная идея получит поддержку сообщества, и Дмитрий будет не против помочь с ее реализацией — можно будет заняться воплощением системы в действительность.

Хочется верить, что я достаточно подробно и внятно описал эту идею. Очень надеюсь на ваши комментарии.
20:21 ← 09 февраля 2010 Отправить в Твиттер sudersuder  RSS comments 6

Комментарии (6) ↓

Fr3nzy Fr3nzy time 12:55 ← 10 февраля 2010 #
Собственно, такие системы уже не раз разрабатывались и писались. По-моему, для CI уже подобную систему делали — интегрировать в Cogear будет не так сложно.
С использованием кеша система приемлема, без кеша — слишком требовательна.

Я уже забыл, как реализован кеш в Cogear: если есть возможность для каких-то конкретных записей задавать время жизни infinite, то такую систему можно даже сделать :) если же нет, то придется редактировать еще и кеш.
Автор
suder suder time 13:53 ← 10 февраля 2010 #
По поводу кэша: если не передавать функции аргумент lifetime, то срок жизни не будет ограничен.
JiLiZART JiLiZART time 21:55 ← 11 февраля 2010 #
Думаю лучше будет приберечь это для 2ой версии движка, хотя… кто знает =)
FatalRabbit FatalRabbit time 09:42 ← 12 февраля 2010 #
эх как раз ищу такую систему, была бы круто получить такую сразу в cogear. Требуется как раз раздача прав пользователям не на доступ к модулю, а как раз на часть модуля, на возможность редактирования определенного сообщества например.
IceDragon IceDragon time 02:23 ← 17 мая 2010 #
я делал на CI в своей админке следующее:

есть таблица прав пользователя, есть таблица прав группы, есть таблица модулей(у меня — права на доступ к модулю.), есть 3 статуса — по умолчанию, запрещен, разрешен

если права заданы в группе пользователя то они действуют для ползователя у которого установлено «по умолчанию», но не действуют если у пользователя стоит «запрещен». Если у группы нету доступа но у пользователя есть — то итоговый статус доступа к модулю — разрешен.
IceDragon IceDragon time 02:27 ← 17 мая 2010 #
на часть модуля — можно взять схему RBAC (она используется в фреймворке yii) — там создаешь роль, действия, присоединяешь действия к роли (роли можно объединять в другую роль — например роль админ = роль «модератор сообществ» + роль «управление админкой» + еще) потом присваиваешь роль пользователю.