самая простая модель реализации прав доступа

Духовность™

Продвинутый новичок
самая простая модель реализации прав доступа

У меня есть схема адресации такого плана (описание упрощено):
PHP:
// адрес /user/info.html обрабатывает контроллер User_Info
array('url' => '/user/info.html', 'controller' => 'User_Info'), 
// адрес /user/edit.html обрабатывает контроллер User_Info
array('url' => '/user/edit.html', 'controller' => 'User_Edit'),
Есть таблица, в которой регистрируются все общедоступные контроллеры системы:
Код:
id| Controller
----------------
 1| User_Info
 2| User_Edit
 3| Ajax_GetCity

и т.д.
Соответственно группам назначаются права, указывающие, имеет ли группа доступ к данному контроллеру или нет.

Что меня смущает в такой реализации:

1. Приходится в таблицу явно заносить (регистрировать) все общедоступные контролеры системы.
2. Я привязываюсь к имени класса контроллера (в приведенном примере - 'User_Info', 'User_Edit').

А как вы это делаете? У меня есть подозрение, что это самый оптимальный способ. Или нет?
 

AmdY

Пью пиво
Команда форума
PHP:
protected $allowGroup = array('admin');

if (!in_array( $this->getUser('group'),  $this->allowGroup)) {
die();
}
 

Fortop

Новичок
triumvirat
Хочешь совет? Бесплатный :)

Посмотри всего пару реализаций ACL и RBAC - этого достаточно будет для понимания того что ты изобрел.

С вопросом оптимальности будет несколько сложнее. Зависит от задач.
 

Mols

Новичок
triumvirat
В общем виде примерно так и делаю(где позволяет ситуация). Есть общая регистрация контроллеров и связь с ролями.
При старте - получаю карту доступных для пользователя контроллеров.
 

Духовность™

Продвинутый новичок
Fortop
лень

Mols
угу. меня вот эта "регистрация контроллеров" напрягает почему-то... Пришлось под регистрацию контроллеров интерфейс писать. Т.е. сделал я очередной модуль для сайта с тремя контроллерами - будь добр, зарегистрируй их в системе: http://adverts.ru/admin/module/ (не удаляйте там ничего)
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
У меня было сделано тупо:

Прописаны пути в табличке
/admin/users/add
/admin/users/edit
/admin/users/delete

была табличка пути-роли и пути-узеры и юзеры-роли ну и писалось все в виде подобного:
{
if($this->model->access->check() === true){
пыщпыщ
} else {
пщелнахотседова
}
}

Сейчас отошел от такого варианта юзаю иной
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
triumvirat
Увеличил себе геморрой(

Ввел понятие модуля (табличка administrators_modules), чтобы потом ajax-style раскрывать только те деревья прав, что мне будут нужно выставить пользователю или роли. Потом к этой таблице привязал таблицу прав доступа - administrators_rights.

administrators_roles - роли
administrators_roles_to_rights - роли-права
administrators_to_roles - юзеры-роли
administrators_users_to_rights - юзеры-права

В общем сейчас сижу и думаю нахера оно мне месяц назад было надо, задумал что-то сильно глобальное сделать видимо. Чтот оно мне сейчас сильно не нравится...

Просто в прошлой системе у меня были модули управления админами, правами, ролями, новостями, галерея, модуль редактирования css и шаблонов, модуль управления структурой сайта с ЧПУ, модуль блога, и еще вроде бы был недописанный каталог и рекламная площадка с профилями пользователя... В итоге это имело неипической длины простыню прав доступа, если не разбивать помодульно.

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

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
в общем теперь то, что было раньше у меня описано в виде
/admin/users/add
/admin/users/edit
/admin/users/delete
3 строки

теперь имеет свойство add view delete edit и пишется в одну строку. А право доступа=ресурс, джоинится к правам доступа и проверяется как

(ресурс, add)
(ресурс, delete)

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

Viktor_Rez

Новичок
Самая простая как ни странно это - "Да" или "Нет". Ведь на каждый функционал у вас есть проверка как минимум. Ну так прикрутим функцию - результат которой либо false либо true, т.е. могу я менять(добавлять, удалять) контент.

Во вторых, права и всю структуры продумывает человек. И поэтому такая разница в средствах авторизации.
 

akxxiv

Новичок
У меня все контроллеры хранятся в директории Controllers/
В результате просто обхожу все файлы, вытаскиваю имена контроллеров, затем в каждом контроллере ищу метод с суффиксом _action - это действия и сохраняю в таблице прав:

ControllerName.ActionName | UserID | UserGroupID | Right

Где если UserID is not null - парва задаются для пользователя
Где если UserGroupID is not nul - для группы в целом

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

HraKK

Мудак
Команда форума
Чем не нравиться ACL?
У тебя есть таблица ресурсов, есть таблица юзер групп и ты делаешь таблицу соотношений ресурсов и групп к доступу:
idResourse|idGroup|isAllow
вот и все. Ну можешь еще добавить экшены - idAction
И тебе не важно контроллер это или странницы.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
triumvirat
ресурс - это то, к чему проверяется наличие доступа, как-то так.
 

Духовность™

Продвинутый новичок
да это ежу понятно. чем этот ваш ресурс отличается от зарегистрированного мною контроллера (см. пост номер 1)
 

soines

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

HraKK

Мудак
Команда форума
Ресурс понятие абстрактное и наследуемое.
делаю так в контролере регистрирую ресурс( если такого нету он создастся автоматически)
PHP:
protected function init()
{
        $this->Resource = Core_Application::getInstance()->getPermission()->getResource()->root()->admin->services;
}
А вот так проверяю:
PHP:
public function dispatch()
{
        if( !$this->isAllow( $this->Resource, Core_Permission_Action::VIEW ) )
        {
            $Controller = new Modules_Admin_Controller_Login();
            return $Controller->dispatch();
        }
        // do some
}
 
Сверху