Списки управления доступом (ACL)
Phalcon\Acl предоставляет простой и легкий способ управления списками управления доступом (ACL) и правами, связанными с ними. Списки управления доступом (ACL) позволяют приложению контролировать доступ к своим областям и объектам из запросов. Рекомендуется ознакомиться с методологией ACL, чтобы понять ее концепции.
Подводя итог, ACL имеют роли и ресурсы. Ресурсы — это объекты, которые подчиняются правам, определённым для них в ACL. Роли — это объекты, которые запрашивают доступ к ресурсам и могут получить или быть лишены доступа механизмом ACL.
Создание ACL
Этот компонент изначально предназначен для работы в оперативной памяти. Это обеспечивает удобство использования и скорость доступа ко всем аспектам списка. Конструктор Phalcon\Acl принимает в качестве первого параметра адаптер, используемый для извлечения информации, относящейся к списку управления доступом. Ниже приведён пример использования адаптера оперативной памяти:
$acl = new \Phalcon\Acl\Adapter\Memory();
По умолчанию Phalcon\Acl разрешает доступ к действию по ресурсам, которые ещё не были определены. Для повышения уровня безопасности списка доступа можно определить уровень «запрета» как уровень доступа по умолчанию.
// Default action is deny access $acl->setDefaultAction(Phalcon\Acl::DENY);
Добавление ролей в ACL
Роль — это объект, который может или не может получить доступ к определённым ресурсам в списке управления доступом. В качестве примера, мы определим роли как группы людей в организации. Класс Phalcon\Acl\Role доступен для создания ролей более структурированным способом. Давайте добавим несколько ролей в наш недавно созданный список:
// Create some roles
$roleAdmins = new \Phalcon\Acl\Role("Administrators", "Super-User role");
$roleGuests = new \Phalcon\Acl\Role("Guests");
// Add "Guests" role to acl
$acl->addRole($roleGuests);
// Add "Designers" role to acl without a Phalcon\Acl\Role
$acl->addRole("Designers");
Как видите, роли определяются напрямую без использования экземпляра.
Добавление ресурсов
Ресурсы — это объекты, для которых контролируется доступ. Обычно в приложениях MVC ресурсы относятся к контроллерам. Хотя это не обязательно, класс Phalcon\Acl\Resource можно использовать для определения ресурсов. Важно добавить связанные действия или операции к ресурсу, чтобы ACL понимал, что ему нужно контролировать.
// Define the "Customers" resource
$customersResource = new \Phalcon\Acl\Resource("Customers");
// Add "customers" resource with a couple of operations
$acl->addResource($customersResource, "search");
$acl->addResource($customersResource, array("create", "update"));
Определение правил доступа
Теперь у нас есть роли и ресурсы. Пришло время определить ACL, то есть какие роли могут получить доступ к каким ресурсам. Эта часть очень важна, особенно с учётом вашего уровня доступа по умолчанию «разрешить» или «запретить».
// Set access level for roles into resources
$acl->allow("Guests", "Customers", "search");
$acl->allow("Guests", "Customers", "create");
$acl->deny("Guests", "Customers", "update");
Метод allow обозначает, что определённая роль получила разрешение на доступ к определённому ресурсу. Метод deny делает обратное.
Запрос ACL
После того как список будет полностью определён, мы можем запросить его, чтобы проверить, имеет ли роль определённое разрешение или нет.
// Check whether role has access to the operations
$acl->isAllowed("Guests", "Customers", "edit"); //Returns 0
$acl->isAllowed("Guests", "Customers", "search"); //Returns 1
$acl->isAllowed("Guests", "Customers", "create"); //Returns 1
Наследование ролей
Можно создавать сложные структуры ролей, используя наследование, которое предоставляет Phalcon\Acl\Role. Роли могут наследоваться от других ролей, что позволяет получать доступ к наборам ресурсов или подмножествам. Для использования наследования ролей вам необходимо передать наследуемую роль в качестве второго параметра вызова функции при добавлении этой роли в список.
// Create some roles
$roleAdmins = new \Phalcon\Acl\Role("Administrators", "Super-User role");
$roleGuests = new \Phalcon\Acl\Role("Guests");
// Add "Guests" role to acl
$acl->addRole($roleGuests);
// Add "Administrators" role inheriting from "Guests" its accesses
$acl->addRole($roleAdmins, $roleGuests);
Сериализация списков ACL
Для повышения производительности экземпляры Phalcon\Acl можно сериализовать и сохранить в APC, сессии, текстовых файлах или таблице базы данных, чтобы их можно было загрузить при необходимости, не переопределяя весь список. Вы можете сделать это следующим образом:
//Check whether acl data already exist
if (!is_file("app/security/acl.data")) {
$acl = new \Phalcon\Acl\Adapter\Memory();
//... Define roles, resources, access, etc
// Store serialized list into plain file
file_put_contents("app/security/acl.data", serialize($acl));
} else {
//Restore acl object from serialized file
$acl = unserialize(file_get_contents("app/security/acl.data"));
}
// Use acl list as needed
if ($acl->isAllowed("Guests", "Customers", "edit")) {
echo "Access granted!";
} else {
echo "Access denied :(";
}
События ACL
Phalcon\Acl может отправлять события в EventsManager, если он присутствует. События срабатывают с типом «acl». Некоторые события при возвращении значения false могут остановить активную операцию. Поддерживаются следующие события:
| Имя события | Срабатывает | Может остановить операцию? |
|---|---|---|
| beforeCheckAccess | Срабатывает перед проверкой, имеет ли роль/ресурс доступ | Да |
| afterCheckAccess | Срабатывает после проверки, имеет ли роль/ресурс доступ | Нет |
Следующий пример демонстрирует, как прикрепить обработчики к этому компоненту:
//Create an event manager
$eventsManager = new Phalcon\Events\Manager();
//Attach a listener for type "acl"
$eventsManager->attach("acl", function($event, $acl) {
if ($event->getType() == "beforeCheckAccess") {
echo $acl->getActiveRole(),
$acl->getActiveResource(),
$acl->getActiveAccess();
}
});
$acl = new \Phalcon\Acl\Adapter\Memory();
//Setup the $acl
//...
//Bind the eventsManager to the acl component
$acl->setEventsManager($eventManagers);
Реализация собственных адаптеров
Интерфейс Phalcon\Acl\AdapterInterface необходимо реализовать для создания собственных адаптеров ACL или расширения существующих.
© 2011–2016 Phalcon Framework Team
Licensed under the Creative Commons Attribution License 3.0.
https://docs.phalconphp.com/en/2.0.0/reference/acl.html