Я борюсь с реализацией контроля доступа для пользовательской среды.
Детализация RBAC не нужна, поэтому я решил использовать какой-то ACL, где ресурсы будут действиями контроллера.
Вот структура базы данных:
пользователи:
- Джон
- Мэри
- Грег
группы_пользователей:
- Администраторы
- Бухгалтеры
- Менеджеры
users_to_user_groups:
- Джон => Администраторы
- Мэри => Бухгалтеры
- Грег => Менеджеры
ресурсы (действия контроллера):
- пользователи/изменить
- счета/добавить
- клиенты/удалить
resources_to_user_groups:
- пользователи/изменить => Администраторы
- счета/добавить => Бухгалтеры
- клиенты/удалить => Менеджеры
А вот и [псевдо]код.
$user = new User; // This will be currently logged in user ...
$acl = new Acl($user);
$dispatcher = new Dispatcher($acl);
$dispatcher->dispatch('users', 'new');
class Dispatcher
{
public function dispatch($controller, $action)
{
$permission = $controller . '/' . $action;
if(!$this->acl->isAllowed($permission))
{
throw new AccessDeniedException("Access denied");
}
// User is authorized to execute this action, dispatch ...
}
}
Мне нравился этот подход... пока я не понял, что XHR-запросов тоже много.
Например, список счетов использует запрос XHR для получения общей суммы, список заказов использует запросы XHR для загрузки позиций заказа и других данных и т. д.
Значит, должна быть какая-то группировка ресурсов, например, новая таблица resource_groups:
- Список счетов (счета/список, счета/xhr_get_total_amount)
- Список заказов (заказы/список, заказы/xhr_get_positons_for_order, заказы/xhr_get_some_other_data)
- Добавить нового пользователя (users/new) # Одно действие, форма ввода нового пользователя не использует запросы XHR
... и вместо того, чтобы назначать ресурсы группам пользователей, назначайте группы ресурсов группам пользователей.
Чувствуется так сложно. Это правильный способ сделать это? Что можно улучшить? Решает ли какая-либо структура эту проблему?
/branch 1/branch 1.1
, что означает, что у вас есть массив в PHP, например$resources['tree']['branch 1']['tree']['branch 1.1']
. И вам нужно объединить массивы$resources['resources']
и$resources['tree']['branch 1']['resources']
и$resources['tree']['branch 1']['tree']['branch 1.1']['resources']
, чтобы составить список ресурсов, с которыми они поставляются. Я уверен, что вы сами можете понять необходимость использования записейtree
иresources
. 28.05.2013