Spec-Zone.ru › Phalcon 2

Списки управления доступом (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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API