Пока я пишу импортеры/экспортеры размышляю о системе управления пользователями в блоголёте. Сейчас в блоголёте пользователь один и он может все. Необходимо придумать систему управления правами пользователей. Пока самое неприятное в этой системе - это проверка прав на каждый чих, а именно в админке и xmlrpc.

И так какие же могут быть права? Рисуются следующие: добавить, редактировать, удалить, просмотреть. Следующее над какими сущностями можно иметь права. Ну это будет посты, комментарии, темы, плагины. Но это еще не все и не так просто. Например возьмем посты - он может создавать новые посты и редактировать свои собственные. Как же такие права можно формализовать? Через единую систему управления правами? Следовательно мало просто посты, нужна еще отдельная сущность - один пост и права на него. Если пойти дальше в абстракции, то можно разрешить комментаторам редактировать свои собственные комментарии - а почему бы и нет?

Абстракции, абстракциями, но нужен единый универсальный механизм. Ну вот например


$users = TUsers::Instance(); //традиционно
$user = $users->login($login, $pass);
if ($user->can('edit', 'posts')) {
//может редактировать любые посты, но как быть с индивидуальным?
}

//проверять через создание объекта и проверка прав через него?
$post = TPost::Instance($id);
if ($post->CanEdit($user)) {
//ну значить надо определить интерфейс для этого, который бы реализовывал класс? Это интересная мысль
}

Ну следовательно вопрос решен следующим образом: прописать интерфейс, в котором будет простынка методов проверки. Также будет отдельная таблица с правами, чтобы можно было проверить без создания объекта.

Интерфейс вообще можно сделать в виде одной функции, а сами методы динамическими (через __call). Ну что то типа


public function CheckRights($action, $user) {
if ($this->author == $user->id)) return true;
return false;
}

С другой стороны придумывать велосипед не стоит - уже давно опробовано существуют права в файловой системе, где действия это чтение, запись, выполнение. Пользователи это владелец, группа и остальные. И право проверяется простой битовой операцией. В блоголёте тоже надо ввести понятие группы. Следовательно надо еще придумать (расписать) управление группами. Например самый главный админ может рулить всеми группами.

Что то я застрял с рутом - как же его права определяются исходя из маски прав на файл? Рут может все, вне зависимости от того, какие права ставит владелец - это как определяется?