Разработка сайта для Вашего бизнеса. Веб дизайн. Дизайн логотипа, фирменного стиля, рекламная фотография . Комплексный рекламный креатив.

Ralex. We do the work.
На рынке с 1999го года. Средняя ценовая категория. Ориентация на эффективность решений.
Ознакомтесь с нашим портфолио
Узнайте больше о услугах
Свяжитесь с нами:
E-mail: [email protected]
Tel: (044) 587 - 84 - 78
Custom web design & дизайн и разработка сайта "под ключ"
Креативный, эффективный дизайн. Система управления сайтом (СУС).
Custom flexible разработка систем электронной коммерции
Система e-commerce разрабатывается под индивидуальные потребности. Гибкая функциональность.
Search Engine Optimzation & оптимизация под поисковые системы (SEO)
Постоянная оптимизация и мониторинг сайта в поисковых системах. Достигаем результата быстро и эффективно
Custom logo design & дизайн логотипа и фирменного стиля
Многолетний опыт. Огромное портфолио. Уникальное предложение и цена.
профессиональная рекламная фотография
креативно, смело, качественно
Custom logo design & рекламный креатив. дизайн рекламы
Многолетний опыт. Огромное портфолио. Уникальное предложение и цена.

Безпека: Вхід | Повне керівництво по Yii 2.0 | Yii PHP Framework

  1. Безпека: Вхід | Повне керівництво по Yii 2.0 | Yii PHP Framework
  2. Фільтри контролю доступу ¶
  3. Контроль доступу на основі ролей (RBAC) ¶
  4. Основні концепції ¶
  5. Налаштування RBAC Manager ¶
  6. Налаштування authManager за допомогою PhpManager ¶
  7. Налаштування authManager за допомогою DbManager ¶
  8. Створення даних авторизації ¶
  9. Використання правил ¶
  10. Перевірка доступу ¶
  11. Використання ролі за замовчуванням ¶
  12. Безпека: Вхід | Повне керівництво по Yii 2.0 | Yii PHP Framework
  13. Фільтри контролю доступу ¶
  14. Контроль доступу на основі ролей (RBAC) ¶
  15. Основні концепції ¶
  16. Налаштування RBAC Manager ¶
  17. Налаштування authManager за допомогою PhpManager ¶
  18. Налаштування authManager за допомогою DbManager ¶
  19. Створення даних авторизації ¶
  20. Використання правил ¶
  21. Перевірка доступу ¶
  22. Використання ролі за замовчуванням ¶
  23. Безпека: Вхід | Повне керівництво по Yii 2.0 | Yii PHP Framework
  24. Фільтри контролю доступу ¶
  25. Контроль доступу на основі ролей (RBAC) ¶
  26. Основні концепції ¶
  27. Налаштування RBAC Manager ¶
  28. Налаштування authManager за допомогою PhpManager ¶
  29. Налаштування authManager за допомогою DbManager ¶
  30. Створення даних авторизації ¶
  31. Використання правил ¶
  32. Перевірка доступу ¶
  33. Використання ролі за замовчуванням ¶

Безпека: Вхід | Повне керівництво по Yii 2.0 | Yii PHP Framework

Наша взаимовыгодная связь https://banwar.org/

Примітка: цей розділ знаходиться на стадії розробки.

Авторизація - це процес перевірки того, що користувач має достатньо прав, щоб виконати якісь дії. Yii надає два методи авторизації: фільтри контролю доступу (ACF) і контроль доступу на основі ролей (RBAC).

Фільтри контролю доступу

Фільтри контролю доступу (ACF) є простим методом, який найкраще використовувати в додатках з простим контролем доступу. Як видно з їх назви, ACF - це фільтри, які можуть приєднуватися до контролера або модулю як поведінку. ACF перевіряє набір правил доступу , Щоб переконатися, що користувач має доступ до запрошенням дії.

Код нижче показує, як використовувати ACF фільтр, реалізований в yii \ filters \ AccessControl :

use yii \ filters \ AccessControl; class SiteController extends Controller {public function behaviors () {return [ 'access' => [ 'class' => AccessControl :: className (), 'only' => [ 'login', 'logout', 'signup'], 'rules' => [[ 'allow' => true, 'actions' => [ 'login', 'signup'], 'roles' => [ '?' ],], [ 'Allow' => true, 'actions' => [ 'logout'], 'roles' => [ '@'],],],],]; }}

Код вище показує ACF фільтр, пов'язаний з контролером site через поведінку. Це типовий спосіб використання фільтрів дій. Параметр only вказує, що фільтр ACF потрібно застосовувати тільки до дій login, logout і signup. Параметр rules задає правила доступу , Які означають наступне:

  • Дозволити всім гостям (ще не пройшли авторизацію) доступ до дій login і signup. Опція roles містить знак питання?, Це спеціальний токен що позначає "гостя".
  • Дозволити аутентифицироваться користувачам доступ до дії logout. Символ @ - це інший спеціальний токен, що позначає аутентифицированного користувача.

Коли фільтр ACF проводить перевірку авторизації, він перевіряє правила по одному зверху вниз, поки не знайде збіг. Значення опції allow обраного правила вказує, авторізовиваться користувача чи ні. Якщо жодне з правил не співпало, то користувач вважається неавторизованого, і фільтр ACF зупиняє подальше виконання дії.

За замовчуванням, коли у користувача не маєте доступу до поточного дії, ACF робить наступне:

  • Якщо користувач гість, викликається yii \ web \ User :: loginRequired () , Який перенаправляє браузер на сторінку входу.
  • Якщо користувач авторизований, генерується виняток yii \ web \ ForbiddenHttpException .

Ви можете перевизначити цю поведінку, налаштувавши властивість yii \ filters \ AccessControl :: $ denyCallback :

[ 'Class' => AccessControl :: className (), 'denyCallback' => function ($ rule, $ action) {throw new \ Exception ( 'Ви не маєте доступу до цієї сторінки'); }]

Правила доступу підтримують набір властивостей. Нижче дано короткий опис підтримуваних опцій. Ви також можете розширити yii \ filters \ AccessRule , Щоб створити свій власний клас правил доступу.

  • allow : Задає яке це правило, "allow" або "deny".

  • actions : Задає дії, що відповідають цьому правилу. Значення має бути масивом ідентифікаторів дій. Порівняння - чутливі до регістру. Якщо властивість пусте або не задано, то правило застосовується до всіх дій.

  • controllers : Задає контролери, яким відповідає правило. Значення має бути масивом з ідентифікаторами контролерів. Порівняння чутливі до регістру. Якщо властивість пусте або не задано, то правило застосовується до всіх контролерам.

  • roles : Задає ролі користувачів, які відповідають цьому правилу. Розпізнаються дві спеціальні ролі, які перевіряються за допомогою yii \ web \ User :: $ isGuest :

    • ?: Відповідає гостьовому користувачеві (НЕ аутентифікований),
    • @: Відповідає аутентифікованим користувачеві.

    Використання інших імен ролей буде приводити до виклику методу yii \ web \ User :: can () , Який вимагає включення RBAC (буде описано далі). Якщо властивість пусте або не задано, то правило застосовується до всіх ролям.

  • ips : задає IP адреси користувачів , Для яких застосовується це правило. IP адреса може містити * в кінці, так щоб він відповідав IP адресою з таким же префіксом. Для прикладу, '192.168. *' Відповідає всім IP адресами в сегменті '192.168.'. Якщо властивість пусте або не задано, то правило застосовується до всіх IP адресами.

  • verbs : Задає http метод (наприклад, GET, POST), відповідний правилу. Порівняння - регістронезавісімого.

  • matchCallback : Задає PHP колбек, який викликається для визначення, що правило повинно бути застосовано.

  • denyCallback : Задає PHP колбек, який буде викликаний, якщо доступ буде заборонений при виклику цього правила.

Нижче показаний приклад, який показує використання опції matchCallback, яка дозволяє писати довільну логіку перевірки доступу:

use yii \ filters \ AccessControl; class SiteController extends Controller {public function behaviors () {return [ 'access' => [ 'class' => AccessControl :: className (), 'only' => [ 'special-callback'], 'rules' => [ [ 'actions' => [ 'special-callback'], 'allow' => true, 'matchCallback' => function ($ rule, $ action) {return date ( 'dm') === '31 -10 ' ; }],],],]; } Public function actionSpecialCallback () {return $ this -> render ( 'happy-halloween'); }}

Контроль доступу на основі ролей (RBAC)

Управління доступом на основі ролей (RBAC) забезпечує простий, але потужний централізований контроль доступу. Будь ласка, зверніться до Wikipedia для отримання інформації про порівняння RBAC з іншими, більш традиційними, системами контролю доступу.

Yii реалізує загальну ієрархічну RBAC, слідуючи NIST RBAC model . Забезпечується функціональність RBAC через компонент додатка authManager .

Використання RBAC складається з двох частин. Перша частина - це створення RBAC даних авторизації, і друга частина - це використання даних авторизації для перевірки доступу в тому місці, де це потрібно.

Для полегшення подальшого опису, ми спочатку введемо деякі основні поняття RBAC.

Основні концепції

Роль являє собою набір дозволів (permissions) (наприклад, створення повідомлення, оновлення повідомлення). Роль може бути призначена на одного або багатьох користувачів. Щоб перевірити, чи має користувач вказані дозволи, ми повинні перевірити, чи призначена користувачеві роль, яка містить даний дозвіл.

З кожною роллю або дозволом може бути пов'язано правило (rule). Правило являє собою шматок коду, який буде виконуватися в ході перевірки доступу для визначення чи може бути застосована відповідна роль або дозвіл до активного користувача. Наприклад, дозвіл "оновлення поста" може мати правило, яке перевіряє чи є поточний користувач автором поста. Під час перевірки доступу, якщо користувач не є автором поста, він / вона буде вважатися не мають дозволу "оновлення поста".

І ролі, і дозволу можуть бути організовані в ієрархію. Зокрема, роль може містити інші ролі або дозволу; і дозволу можуть містити інші дозволи. Yii реалізує частково впорядковану ієрархію, яка включає в себе спеціальні дерева ієрархії. Роль може містити дозвіл, але зворотне не вірно.

Налаштування RBAC Manager

Перед визначенням авторизаційних даних і перевіркою прав доступу, ми повинні налаштувати компонент додатка authManager . Yii надає два типи менеджерів авторизації: yii \ rbac \ PhpManager і yii \ rbac \ DbManager . Перший використовує файл з PHP скриптом для зберігання даних авторизації, другий зберігає дані в базі даних. Ви можете використовувати перший, якщо ваше додаток не вимагає занадто динамічного управління ролями та дозволами.

Налаштування authManager за допомогою PhpManager

Наступний код показує як налаштувати в конфігурації програми authManager з використанням класу yii \ rbac \ PhpManager :

return [ 'components' => [ 'authManager' => [ 'class' => 'yii \ rbac \ PhpManager',],],];

Тепер authManager може бути доступний через \ Yii :: $ app-> authManager.

Зауваження: За умовчанням, yii \ rbac \ PhpManager зберігає дані RBAC в файлах в директорії @ app / rbac /. Переконайтеся що дана директорія і файли в них доступні для запису Web сервера, якщо ієрархія дозволів повинна змінюватися онлайн.

Налаштування authManager за допомогою DbManager

Наступний код показує як налаштувати в конфігурації програми authManager з використанням класу yii \ rbac \ DbManager :

return [ 'components' => [ 'authManager' => [ 'class' => 'yii \ rbac \ DbManager',],],];

DbManager використовує чотири таблиці для зберігання даних:

  • itemTable : Таблиця для зберігання авторизаційних елементів. За замовчуванням "auth_item".
  • itemChildTable : Таблиця для зберігання ієрархії елементів. За замовчуванням "auth_item_child".
  • assignmentTable : Таблиця для зберігання призначень елементів авторизації. За замовчуванням "auth_assignment".
  • ruleTable : Таблиця для зберігання правил. За замовчуванням "auth_rule".

Перш ніж ви почнете використовувати цей менеджер, вам потрібно створити таблиці в базі даних. Щоб зробити це, ви можете використовувати міграцію зберігається в файлі @ yii / rbac / migrations:

yii migrate --migrationPath = @ yii / rbac / migrations

Тепер authManager може бути доступний через \ Yii :: $ app-> authManager.

Створення даних авторизації

Для створення даних авторизації потрібно виконати наступні завдання:

  • визначення ролей і дозволів;
  • установка відносин між ролями та правами доступу;
  • визначення правил;
  • зв'язування правил з ролями та дозволами;
  • призначення ролей користувачам.

Залежно від вимог до гнучкості авторизації перераховані завдання можуть бути виконані різними шляхами.

Якщо ієрархія прав не змінюється, і кількість користувачів зафіксовано, ви можете створити консольную команду , Яка буде раз форматувати дані через APIs, що надається authManager:

<? Php namespace app \ commands; use Yii; use yii \ console \ Controller; class RbacController extends Controller {public function actionInit () {$ auth = Yii :: $ app -> authManager; $ CreatePost = $ auth -> createPermission ( 'createPost'); $ CreatePost -> description = 'Create a post'; $ Auth -> add ($ createPost); $ UpdatePost = $ auth -> createPermission ( 'updatePost'); $ UpdatePost -> description = 'Update post'; $ Auth -> add ($ updatePost); $ Author = $ auth -> createRole ( 'author'); $ Auth -> add ($ author); $ Auth -> addChild ($ author, $ createPost); $ Admin = $ auth -> createRole ( 'admin'); $ Auth -> add ($ admin); $ Auth -> addChild ($ admin, $ updatePost); $ Auth -> addChild ($ admin, $ author); $ Auth -> assign ($ author, 2); $ Auth -> assign ($ admin, 1); }}

Примітка: Якщо ви використовуєте шаблон проекту advanced, RbacController необхідно створити в директорії console / controllers і змінити простір імен на console \ controllers.

Після виконання команди yii rbac / init ми отримаємо наступну ієрархію:

Автор може створювати пост, адміністратор може оновлювати пост і робити все, що може робити автор.

Якщо ваш додаток дозволяє реєструвати користувачів, то вам необхідно відразу призначати ролі цим новим користувачам. Наприклад, для того, щоб все користувачі могли стати авторами в розширеному шаблоні проекту, ви повинні змінити frontend \ models \ SignupForm :: signup () як показано нижче:

public function signup () {if ($ this -> validate ()) {$ user = new User (); $ User -> username = $ this -> username; $ User -> email = $ this -> email; $ User -> setPassword ($ this -> password); $ User -> generateAuthKey (); $ User -> save (false); $ Auth = Yii :: $ app -> authManager; $ AuthorRole = $ auth -> getRole ( 'author'); $ Auth -> assign ($ authorRole, $ user -> getId ()); return $ user; } Return null; }

Для додатків, що вимагають комплексного контролю доступу з динамічно оновлюються даними авторизації, існують спеціальні інтерфейси (так звані адмін-панелі), які можуть бути розроблені з використанням API, пропонованого authManager.

Використання правил

Як згадано вище, правила додають додаткові обмеження на ролі і дозволу. Правила - це класи, що розширюють yii \ rbac \ Rule . Вони повинні реалізовувати метод execute () . В ієрархії, створеної нами раніше, автор не може редагувати свій пост. Давайте виправимо це. Спочатку ми повинні створити правило, що перевіряє що користувач є автором поста:

namespace app \ rbac; use yii \ rbac \ Rule; class AuthorRule extends Rule {public $ name = 'isAuthor'; public function execute ($ user, $ item, $ params) {return isset ($ params [ 'post'])? $ Params [ 'post'] -> createdBy == $ user: false; }}

Правило вище перевіряє, що post був створений $ user. Ми створимо спеціальний дозвіл updateOwnPost в команді, яку ми використовували раніше:

$ Auth = Yii :: $ app -> authManager; $ Rule = new \ app \ rbac \ AuthorRule; $ Auth -> add ($ rule); $ UpdateOwnPost = $ auth -> createPermission ( 'updateOwnPost'); $ UpdateOwnPost -> description = 'Update own post'; $ UpdateOwnPost -> ruleName = $ rule -> name; $ Auth -> add ($ updateOwnPost); $ Auth -> addChild ($ updateOwnPost, $ updatePost); $ Auth -> addChild ($ author, $ updateOwnPost);

Тепер ми маємо наступну ієрархію:

Перевірка доступу

З готовими авторизаційними даними перевірка доступу - це просто виклик методу yii \ rbac \ ManagerInterface :: checkAccess () . Так як більшість перевірок доступу відносяться до активного користувача, для зручності Yii надає скорочений метод yii \ web \ User :: can () , Який можна використовувати як показано нижче:

if (\ Yii :: $ app -> user-> can ( 'createPost')) {}

Якщо поточний користувач Jane з ID = 1, ми почнемо з createPost і спробуємо дістатися до Jane:

Для того щоб перевірити, чи може користувач оновити пост, нам треба передати додатковий параметр, необхідний для правила AuthorRule, описаного раніше:

if (\ Yii :: $ app -> user-> can ( 'updatePost', [ 'post' => $ post])) {}

Ось що відбувається якщо поточним користувачем є John:

Ми починаємо з updatePost і переходимо до updateOwnPost. Для того щоб це відбулося, правило AuthorRule має повернути true при виклику методу execute. Метод отримує $ params, переданий при виклику методу can, значення якого дорівнює [ 'post' => $ post]. Якщо все правильно, ми побачимо, що author прив'язаний до John.

У разі Jane це трохи простіше, тому що вона admin:

Є кілька способів реалізувати авторизацію в контролері. Якщо вам необхідні окремі права на додавання і видалення, то перевірку варто робити в кожній дії. Ви можете або використовувати умова вище в кожному методі дії, або використовувати yii \ filters \ AccessControl :

public function behaviors () {return [ 'access' => [ 'class' => AccessControl :: className (), 'rules' => [[ 'allow' => true, 'actions' => [ 'index'] , 'roles' => [ 'managePost'],], [ 'allow' => true, 'actions' => [ 'view'], 'roles' => [ 'viewPost'],], [ 'allow' => true, 'actions' => [ 'create'], 'roles' => [ 'createPost'],], [ 'allow' => true, 'actions' => [ 'update'], 'roles' => [ 'updatePost'],], [ 'allow' => true, 'actions' => [ 'delete'], 'roles' => [ 'deletePost'],],],],]; }

Якщо права на все CRUD операції видаються разом, то краще рішення в цьому випадку - завести один дозвіл на зразок managePost і перевіряти його в yii \ web \ Controller :: beforeAction () .

Використання ролі за замовчуванням

Роль за умовчанням - це роль, яка неявно присвоюється всім користувачам. виклик методу yii \ rbac \ ManagerInterface :: assign () не потрібно, і авторизовані дані не містять інформації про призначення.

Роль за умовчанням зазвичай пов'язують з правилом, що визначає до якої ролі належить кожен користувач.

Ролі за замовчуванням зазвичай використовуються в додатках, які вже мають якийсь опис ролей. Для прикладу, додаток може мати стовпець "group" в таблиці користувачів, і кожен користувач належить до якоїсь групи. Якщо кожна група може бути порівняна ролі в моделі RBAC, ви можете використовувати роль за замовчуванням для автоматичного призначення кожному користувачеві ролі RBAC. Давайте використаємо приклад, щоб зрозуміти як це можна зробити.

Припустимо що в таблиці користувачів у вас є стовпець group, в якому значення 1 представляє групу "адміністратор", а 2 - групу "автор". Ви плануєте мати дві RBAC ролі: admin і author, що представляють дозволу для двох відповідних груп. Ви можете налаштувати дані ролі як показано нижче.

namespace app \ rbac; use Yii; use yii \ rbac \ Rule; class UserGroupRule extends Rule {public $ name = 'userGroup'; public function execute ($ user, $ item, $ params) {if (! Yii :: $ app -> user-> isGuest) {$ group = Yii :: $ app -> user-> identity-> group; if ($ item -> name === 'admin') {return $ group == 1; } Elseif ($ item -> name === 'author') {return $ group == 1 || $ Group == 2; }} Return false; }} $ Auth = Yii :: $ app -> authManager; $ Rule = new \ app \ rbac \ UserGroupRule; $ Auth -> add ($ rule); $ Author = $ auth -> createRole ( 'author'); $ Author -> ruleName = $ rule -> name; $ Auth -> add ($ author); $ Admin = $ auth -> createRole ( 'admin'); $ Admin -> ruleName = $ rule -> name; $ Auth -> add ($ admin); $ Auth -> addChild ($ admin, $ author);

Зверніть увагу, так як "author" доданий як дочірня роль до "admin", отже в реалізації методу execute () класу правила ви повинні враховувати цю ієрархію. Саме тому для ролі "author" метод execute () поверне істину, якщо користувач належить до груп 1 або 2 (це означає, що користувач знаходиться в групі адміністраторів або авторів)

Далі налаштуємо authManager за допомогою перерахування ролей у властивості yii \ rbac \ BaseManager :: $ defaultRoles :

return [ 'components' => [ 'authManager' => [ 'class' => 'yii \ rbac \ PhpManager', 'defaultRoles' => [ 'admin', 'author'],],],];

Тепер, якщо ви виконаєте перевірку доступу, для обох ролей admin і author буде виконана перевірка правила, асоційованого з ними. Якщо правило поверне істину, це буде означати, що роль застосовується до активного користувача. На підставі правила, реалізованого вище: якщо користувач входить в групу 1, користувачеві буде призначена роль admin; і якщо значення group одно 2, буде застосована роль author.

Безпека: Вхід | Повне керівництво по Yii 2.0 | Yii PHP Framework

Примітка: цей розділ знаходиться на стадії розробки.

Авторизація - це процес перевірки того, що користувач має достатньо прав, щоб виконати якісь дії. Yii надає два методи авторизації: фільтри контролю доступу (ACF) і контроль доступу на основі ролей (RBAC).

Фільтри контролю доступу

Фільтри контролю доступу (ACF) є простим методом, який найкраще використовувати в додатках з простим контролем доступу. Як видно з їх назви, ACF - це фільтри, які можуть приєднуватися до контролера або модулю як поведінку. ACF перевіряє набір правил доступу , Щоб переконатися, що користувач має доступ до запрошенням дії.

Код нижче показує, як використовувати ACF фільтр, реалізований в yii \ filters \ AccessControl :

use yii \ filters \ AccessControl; class SiteController extends Controller {public function behaviors () {return [ 'access' => [ 'class' => AccessControl :: className (), 'only' => [ 'login', 'logout', 'signup'], 'rules' => [[ 'allow' => true, 'actions' => [ 'login', 'signup'], 'roles' => [ '?' ],], [ 'Allow' => true, 'actions' => [ 'logout'], 'roles' => [ '@'],],],],]; }}

Код вище показує ACF фільтр, пов'язаний з контролером site через поведінку. Це типовий спосіб використання фільтрів дій. Параметр only вказує, що фільтр ACF потрібно застосовувати тільки до дій login, logout і signup. Параметр rules задає правила доступу , Які означають наступне:

  • Дозволити всім гостям (ще не пройшли авторизацію) доступ до дій login і signup. Опція roles містить знак питання?, Це спеціальний токен що позначає "гостя".
  • Дозволити аутентифицироваться користувачам доступ до дії logout. Символ @ - це інший спеціальний токен, що позначає аутентифицированного користувача.

Коли фільтр ACF проводить перевірку авторизації, він перевіряє правила по одному зверху вниз, поки не знайде збіг. Значення опції allow обраного правила вказує, авторізовиваться користувача чи ні. Якщо жодне з правил не співпало, то користувач вважається неавторизованого, і фільтр ACF зупиняє подальше виконання дії.

За замовчуванням, коли у користувача не маєте доступу до поточного дії, ACF робить наступне:

  • Якщо користувач гість, викликається yii \ web \ User :: loginRequired () , Який перенаправляє браузер на сторінку входу.
  • Якщо користувач авторизований, генерується виняток yii \ web \ ForbiddenHttpException .

Ви можете перевизначити цю поведінку, налаштувавши властивість yii \ filters \ AccessControl :: $ denyCallback :

[ 'Class' => AccessControl :: className (), 'denyCallback' => function ($ rule, $ action) {throw new \ Exception ( 'Ви не маєте доступу до цієї сторінки'); }]

Правила доступу підтримують набір властивостей. Нижче дано короткий опис підтримуваних опцій. Ви також можете розширити yii \ filters \ AccessRule , Щоб створити свій власний клас правил доступу.

  • allow : Задає яке це правило, "allow" або "deny".

  • actions : Задає дії, що відповідають цьому правилу. Значення має бути масивом ідентифікаторів дій. Порівняння - чутливі до регістру. Якщо властивість пусте або не задано, то правило застосовується до всіх дій.

  • controllers : Задає контролери, яким відповідає правило. Значення має бути масивом з ідентифікаторами контролерів. Порівняння чутливі до регістру. Якщо властивість пусте або не задано, то правило застосовується до всіх контролерам.

  • roles : Задає ролі користувачів, які відповідають цьому правилу. Розпізнаються дві спеціальні ролі, які перевіряються за допомогою yii \ web \ User :: $ isGuest :

    • ?: Відповідає гостьовому користувачеві (НЕ аутентифікований),
    • @: Відповідає аутентифікованим користувачеві.

    Використання інших імен ролей буде приводити до виклику методу yii \ web \ User :: can () , Який вимагає включення RBAC (буде описано далі). Якщо властивість пусте або не задано, то правило застосовується до всіх ролям.

  • ips : задає IP адреси користувачів , Для яких застосовується це правило. IP адреса може містити * в кінці, так щоб він відповідав IP адресою з таким же префіксом. Для прикладу, '192.168. *' Відповідає всім IP адресами в сегменті '192.168.'. Якщо властивість пусте або не задано, то правило застосовується до всіх IP адресами.

  • verbs : Задає http метод (наприклад, GET, POST), відповідний правилу. Порівняння - регістронезавісімого.

  • matchCallback : Задає PHP колбек, який викликається для визначення, що правило повинно бути застосовано.

  • denyCallback : Задає PHP колбек, який буде викликаний, якщо доступ буде заборонений при виклику цього правила.

Нижче показаний приклад, який показує використання опції matchCallback, яка дозволяє писати довільну логіку перевірки доступу:

use yii \ filters \ AccessControl; class SiteController extends Controller {public function behaviors () {return [ 'access' => [ 'class' => AccessControl :: className (), 'only' => [ 'special-callback'], 'rules' => [ [ 'actions' => [ 'special-callback'], 'allow' => true, 'matchCallback' => function ($ rule, $ action) {return date ( 'dm') === '31 -10 ' ; }],],],]; } Public function actionSpecialCallback () {return $ this -> render ( 'happy-halloween'); }}

Контроль доступу на основі ролей (RBAC)

Управління доступом на основі ролей (RBAC) забезпечує простий, але потужний централізований контроль доступу. Будь ласка, зверніться до Wikipedia для отримання інформації про порівняння RBAC з іншими, більш традиційними, системами контролю доступу.

Yii реалізує загальну ієрархічну RBAC, слідуючи NIST RBAC model . Забезпечується функціональність RBAC через компонент додатка authManager .

Використання RBAC складається з двох частин. Перша частина - це створення RBAC даних авторизації, і друга частина - це використання даних авторизації для перевірки доступу в тому місці, де це потрібно.

Для полегшення подальшого опису, ми спочатку введемо деякі основні поняття RBAC.

Основні концепції

Роль являє собою набір дозволів (permissions) (наприклад, створення повідомлення, оновлення повідомлення). Роль може бути призначена на одного або багатьох користувачів. Щоб перевірити, чи має користувач вказані дозволи, ми повинні перевірити, чи призначена користувачеві роль, яка містить даний дозвіл.

З кожною роллю або дозволом може бути пов'язано правило (rule). Правило являє собою шматок коду, який буде виконуватися в ході перевірки доступу для визначення чи може бути застосована відповідна роль або дозвіл до активного користувача. Наприклад, дозвіл "оновлення поста" може мати правило, яке перевіряє чи є поточний користувач автором поста. Під час перевірки доступу, якщо користувач не є автором поста, він / вона буде вважатися не мають дозволу "оновлення поста".

І ролі, і дозволу можуть бути організовані в ієрархію. Зокрема, роль може містити інші ролі або дозволу; і дозволу можуть містити інші дозволи. Yii реалізує частково впорядковану ієрархію, яка включає в себе спеціальні дерева ієрархії. Роль може містити дозвіл, але зворотне не вірно.

Налаштування RBAC Manager

Перед визначенням авторизаційних даних і перевіркою прав доступу, ми повинні налаштувати компонент додатка authManager . Yii надає два типи менеджерів авторизації: yii \ rbac \ PhpManager і yii \ rbac \ DbManager . Перший використовує файл з PHP скриптом для зберігання даних авторизації, другий зберігає дані в базі даних. Ви можете використовувати перший, якщо ваше додаток не вимагає занадто динамічного управління ролями та дозволами.

Налаштування authManager за допомогою PhpManager

Наступний код показує як налаштувати в конфігурації програми authManager з використанням класу yii \ rbac \ PhpManager :

return [ 'components' => [ 'authManager' => [ 'class' => 'yii \ rbac \ PhpManager',],],];

Тепер authManager може бути доступний через \ Yii :: $ app-> authManager.

Зауваження: За умовчанням, yii \ rbac \ PhpManager зберігає дані RBAC в файлах в директорії @ app / rbac /. Переконайтеся що дана директорія і файли в них доступні для запису Web сервера, якщо ієрархія дозволів повинна змінюватися онлайн.

Налаштування authManager за допомогою DbManager

Наступний код показує як налаштувати в конфігурації програми authManager з використанням класу yii \ rbac \ DbManager :

return [ 'components' => [ 'authManager' => [ 'class' => 'yii \ rbac \ DbManager',],],];

DbManager використовує чотири таблиці для зберігання даних:

  • itemTable : Таблиця для зберігання авторизаційних елементів. За замовчуванням "auth_item".
  • itemChildTable : Таблиця для зберігання ієрархії елементів. За замовчуванням "auth_item_child".
  • assignmentTable : Таблиця для зберігання призначень елементів авторизації. За замовчуванням "auth_assignment".
  • ruleTable : Таблиця для зберігання правил. За замовчуванням "auth_rule".

Перш ніж ви почнете використовувати цей менеджер, вам потрібно створити таблиці в базі даних. Щоб зробити це, ви можете використовувати міграцію зберігається в файлі @ yii / rbac / migrations:

yii migrate --migrationPath = @ yii / rbac / migrations

Тепер authManager може бути доступний через \ Yii :: $ app-> authManager.

Створення даних авторизації

Для створення даних авторизації потрібно виконати наступні завдання:

  • визначення ролей і дозволів;
  • установка відносин між ролями та правами доступу;
  • визначення правил;
  • зв'язування правил з ролями та дозволами;
  • призначення ролей користувачам.

Залежно від вимог до гнучкості авторизації перераховані завдання можуть бути виконані різними шляхами.

Якщо ієрархія прав не змінюється, і кількість користувачів зафіксовано, ви можете створити консольную команду , Яка буде раз форматувати дані через APIs, що надається authManager:

<? Php namespace app \ commands; use Yii; use yii \ console \ Controller; class RbacController extends Controller {public function actionInit () {$ auth = Yii :: $ app -> authManager; $ CreatePost = $ auth -> createPermission ( 'createPost'); $ CreatePost -> description = 'Create a post'; $ Auth -> add ($ createPost); $ UpdatePost = $ auth -> createPermission ( 'updatePost'); $ UpdatePost -> description = 'Update post'; $ Auth -> add ($ updatePost); $ Author = $ auth -> createRole ( 'author'); $ Auth -> add ($ author); $ Auth -> addChild ($ author, $ createPost); $ Admin = $ auth -> createRole ( 'admin'); $ Auth -> add ($ admin); $ Auth -> addChild ($ admin, $ updatePost); $ Auth -> addChild ($ admin, $ author); $ Auth -> assign ($ author, 2); $ Auth -> assign ($ admin, 1); }}

Примітка: Якщо ви використовуєте шаблон проекту advanced, RbacController необхідно створити в директорії console / controllers і змінити простір імен на console \ controllers.

Після виконання команди yii rbac / init ми отримаємо наступну ієрархію:

Автор може створювати пост, адміністратор може оновлювати пост і робити все, що може робити автор.

Якщо ваш додаток дозволяє реєструвати користувачів, то вам необхідно відразу призначати ролі цим новим користувачам. Наприклад, для того, щоб все користувачі могли стати авторами в розширеному шаблоні проекту, ви повинні змінити frontend \ models \ SignupForm :: signup () як показано нижче:

public function signup () {if ($ this -> validate ()) {$ user = new User (); $ User -> username = $ this -> username; $ User -> email = $ this -> email; $ User -> setPassword ($ this -> password); $ User -> generateAuthKey (); $ User -> save (false); $ Auth = Yii :: $ app -> authManager; $ AuthorRole = $ auth -> getRole ( 'author'); $ Auth -> assign ($ authorRole, $ user -> getId ()); return $ user; } Return null; }

Для додатків, що вимагають комплексного контролю доступу з динамічно оновлюються даними авторизації, існують спеціальні інтерфейси (так звані адмін-панелі), які можуть бути розроблені з використанням API, пропонованого authManager.

Використання правил

Як згадано вище, правила додають додаткові обмеження на ролі і дозволу. Правила - це класи, що розширюють yii \ rbac \ Rule . Вони повинні реалізовувати метод execute () . В ієрархії, створеної нами раніше, автор не може редагувати свій пост. Давайте виправимо це. Спочатку ми повинні створити правило, що перевіряє що користувач є автором поста:

namespace app \ rbac; use yii \ rbac \ Rule; class AuthorRule extends Rule {public $ name = 'isAuthor'; public function execute ($ user, $ item, $ params) {return isset ($ params [ 'post'])? $ Params [ 'post'] -> createdBy == $ user: false; }}

Правило вище перевіряє, що post був створений $ user. Ми створимо спеціальний дозвіл updateOwnPost в команді, яку ми використовували раніше:

$ Auth = Yii :: $ app -> authManager; $ Rule = new \ app \ rbac \ AuthorRule; $ Auth -> add ($ rule); $ UpdateOwnPost = $ auth -> createPermission ( 'updateOwnPost'); $ UpdateOwnPost -> description = 'Update own post'; $ UpdateOwnPost -> ruleName = $ rule -> name; $ Auth -> add ($ updateOwnPost); $ Auth -> addChild ($ updateOwnPost, $ updatePost); $ Auth -> addChild ($ author, $ updateOwnPost);

Тепер ми маємо наступну ієрархію:

Перевірка доступу

З готовими авторизаційними даними перевірка доступу - це просто виклик методу yii \ rbac \ ManagerInterface :: checkAccess () . Так як більшість перевірок доступу відносяться до активного користувача, для зручності Yii надає скорочений метод yii \ web \ User :: can () , Який можна використовувати як показано нижче:

if (\ Yii :: $ app -> user-> can ( 'createPost')) {}

Якщо поточний користувач Jane з ID = 1, ми почнемо з createPost і спробуємо дістатися до Jane:

Для того щоб перевірити, чи може користувач оновити пост, нам треба передати додатковий параметр, необхідний для правила AuthorRule, описаного раніше:

if (\ Yii :: $ app -> user-> can ( 'updatePost', [ 'post' => $ post])) {}

Ось що відбувається якщо поточним користувачем є John:

Ми починаємо з updatePost і переходимо до updateOwnPost. Для того щоб це відбулося, правило AuthorRule має повернути true при виклику методу execute. Метод отримує $ params, переданий при виклику методу can, значення якого дорівнює [ 'post' => $ post]. Якщо все правильно, ми побачимо, що author прив'язаний до John.

У разі Jane це трохи простіше, тому що вона admin:

Є кілька способів реалізувати авторизацію в контролері. Якщо вам необхідні окремі права на додавання і видалення, то перевірку варто робити в кожній дії. Ви можете або використовувати умова вище в кожному методі дії, або використовувати yii \ filters \ AccessControl :

public function behaviors () {return [ 'access' => [ 'class' => AccessControl :: className (), 'rules' => [[ 'allow' => true, 'actions' => [ 'index'] , 'roles' => [ 'managePost'],], [ 'allow' => true, 'actions' => [ 'view'], 'roles' => [ 'viewPost'],], [ 'allow' => true, 'actions' => [ 'create'], 'roles' => [ 'createPost'],], [ 'allow' => true, 'actions' => [ 'update'], 'roles' => [ 'updatePost'],], [ 'allow' => true, 'actions' => [ 'delete'], 'roles' => [ 'deletePost'],],],],]; }

Якщо права на все CRUD операції видаються разом, то краще рішення в цьому випадку - завести один дозвіл на зразок managePost і перевіряти його в yii \ web \ Controller :: beforeAction () .

Використання ролі за замовчуванням

Роль за умовчанням - це роль, яка неявно присвоюється всім користувачам. виклик методу yii \ rbac \ ManagerInterface :: assign () не потрібно, і авторизовані дані не містять інформації про призначення.

Роль за умовчанням зазвичай пов'язують з правилом, що визначає до якої ролі належить кожен користувач.

Ролі за замовчуванням зазвичай використовуються в додатках, які вже мають якийсь опис ролей. Для прикладу, додаток може мати стовпець "group" в таблиці користувачів, і кожен користувач належить до якоїсь групи. Якщо кожна група може бути порівняна ролі в моделі RBAC, ви можете використовувати роль за замовчуванням для автоматичного призначення кожному користувачеві ролі RBAC. Давайте використаємо приклад, щоб зрозуміти як це можна зробити.

Припустимо що в таблиці користувачів у вас є стовпець group, в якому значення 1 представляє групу "адміністратор", а 2 - групу "автор". Ви плануєте мати дві RBAC ролі: admin і author, що представляють дозволу для двох відповідних груп. Ви можете налаштувати дані ролі як показано нижче.

namespace app \ rbac; use Yii; use yii \ rbac \ Rule; class UserGroupRule extends Rule {public $ name = 'userGroup'; public function execute ($ user, $ item, $ params) {if (! Yii :: $ app -> user-> isGuest) {$ group = Yii :: $ app -> user-> identity-> group; if ($ item -> name === 'admin') {return $ group == 1; } Elseif ($ item -> name === 'author') {return $ group == 1 || $ Group == 2; }} Return false; }} $ Auth = Yii :: $ app -> authManager; $ Rule = new \ app \ rbac \ UserGroupRule; $ Auth -> add ($ rule); $ Author = $ auth -> createRole ( 'author'); $ Author -> ruleName = $ rule -> name; $ Auth -> add ($ author); $ Admin = $ auth -> createRole ( 'admin'); $ Admin -> ruleName = $ rule -> name; $ Auth -> add ($ admin); $ Auth -> addChild ($ admin, $ author);

Зверніть увагу, так як "author" доданий як дочірня роль до "admin", отже в реалізації методу execute () класу правила ви повинні враховувати цю ієрархію. Саме тому для ролі "author" метод execute () поверне істину, якщо користувач належить до груп 1 або 2 (це означає, що користувач знаходиться в групі адміністраторів або авторів)

Далі налаштуємо authManager за допомогою перерахування ролей у властивості yii \ rbac \ BaseManager :: $ defaultRoles :

return [ 'components' => [ 'authManager' => [ 'class' => 'yii \ rbac \ PhpManager', 'defaultRoles' => [ 'admin', 'author'],],],];

Тепер, якщо ви виконаєте перевірку доступу, для обох ролей admin і author буде виконана перевірка правила, асоційованого з ними. Якщо правило поверне істину, це буде означати, що роль застосовується до активного користувача. На підставі правила, реалізованого вище: якщо користувач входить в групу 1, користувачеві буде призначена роль admin; і якщо значення group одно 2, буде застосована роль author.

Безпека: Вхід | Повне керівництво по Yii 2.0 | Yii PHP Framework

Примітка: цей розділ знаходиться на стадії розробки.

Авторизація - це процес перевірки того, що користувач має достатньо прав, щоб виконати якісь дії. Yii надає два методи авторизації: фільтри контролю доступу (ACF) і контроль доступу на основі ролей (RBAC).

Фільтри контролю доступу

Фільтри контролю доступу (ACF) є простим методом, який найкраще використовувати в додатках з простим контролем доступу. Як видно з їх назви, ACF - це фільтри, які можуть приєднуватися до контролера або модулю як поведінку. ACF перевіряє набір правил доступу , Щоб переконатися, що користувач має доступ до запрошенням дії.

Код нижче показує, як використовувати ACF фільтр, реалізований в yii \ filters \ AccessControl :

use yii \ filters \ AccessControl; class SiteController extends Controller {public function behaviors () {return [ 'access' => [ 'class' => AccessControl :: className (), 'only' => [ 'login', 'logout', 'signup'], 'rules' => [[ 'allow' => true, 'actions' => [ 'login', 'signup'], 'roles' => [ '?' ],], [ 'Allow' => true, 'actions' => [ 'logout'], 'roles' => [ '@'],],],],]; }}

Код вище показує ACF фільтр, пов'язаний з контролером site через поведінку. Це типовий спосіб використання фільтрів дій. Параметр only вказує, що фільтр ACF потрібно застосовувати тільки до дій login, logout і signup. Параметр rules задає правила доступу , Які означають наступне:

  • Дозволити всім гостям (ще не пройшли авторизацію) доступ до дій login і signup. Опція roles містить знак питання?, Це спеціальний токен що позначає "гостя".
  • Дозволити аутентифицироваться користувачам доступ до дії logout. Символ @ - це інший спеціальний токен, що позначає аутентифицированного користувача.

Коли фільтр ACF проводить перевірку авторизації, він перевіряє правила по одному зверху вниз, поки не знайде збіг. Значення опції allow обраного правила вказує, авторізовиваться користувача чи ні. Якщо жодне з правил не співпало, то користувач вважається неавторизованого, і фільтр ACF зупиняє подальше виконання дії.

За замовчуванням, коли у користувача не маєте доступу до поточного дії, ACF робить наступне:

  • Якщо користувач гість, викликається yii \ web \ User :: loginRequired () , Який перенаправляє браузер на сторінку входу.
  • Якщо користувач авторизований, генерується виняток yii \ web \ ForbiddenHttpException .

Ви можете перевизначити цю поведінку, налаштувавши властивість yii \ filters \ AccessControl :: $ denyCallback :

[ 'Class' => AccessControl :: className (), 'denyCallback' => function ($ rule, $ action) {throw new \ Exception ( 'Ви не маєте доступу до цієї сторінки'); }]

Правила доступу підтримують набір властивостей. Нижче дано короткий опис підтримуваних опцій. Ви також можете розширити yii \ filters \ AccessRule , Щоб створити свій власний клас правил доступу.

  • allow : Задає яке це правило, "allow" або "deny".

  • actions : Задає дії, що відповідають цьому правилу. Значення має бути масивом ідентифікаторів дій. Порівняння - чутливі до регістру. Якщо властивість пусте або не задано, то правило застосовується до всіх дій.

  • controllers : Задає контролери, яким відповідає правило. Значення має бути масивом з ідентифікаторами контролерів. Порівняння чутливі до регістру. Якщо властивість пусте або не задано, то правило застосовується до всіх контролерам.

  • roles : Задає ролі користувачів, які відповідають цьому правилу. Розпізнаються дві спеціальні ролі, які перевіряються за допомогою yii \ web \ User :: $ isGuest :

    • ?: Відповідає гостьовому користувачеві (НЕ аутентифікований),
    • @: Відповідає аутентифікованим користувачеві.

    Використання інших імен ролей буде приводити до виклику методу yii \ web \ User :: can () , Який вимагає включення RBAC (буде описано далі). Якщо властивість пусте або не задано, то правило застосовується до всіх ролям.

  • ips : задає IP адреси користувачів , Для яких застосовується це правило. IP адреса може містити * в кінці, так щоб він відповідав IP адресою з таким же префіксом. Для прикладу, '192.168. *' Відповідає всім IP адресами в сегменті '192.168.'. Якщо властивість пусте або не задано, то правило застосовується до всіх IP адресами.

  • verbs : Задає http метод (наприклад, GET, POST), відповідний правилу. Порівняння - регістронезавісімого.

  • matchCallback : Задає PHP колбек, який викликається для визначення, що правило повинно бути застосовано.

  • denyCallback : Задає PHP колбек, який буде викликаний, якщо доступ буде заборонений при виклику цього правила.

Нижче показаний приклад, який показує використання опції matchCallback, яка дозволяє писати довільну логіку перевірки доступу:

use yii \ filters \ AccessControl; class SiteController extends Controller {public function behaviors () {return [ 'access' => [ 'class' => AccessControl :: className (), 'only' => [ 'special-callback'], 'rules' => [ [ 'actions' => [ 'special-callback'], 'allow' => true, 'matchCallback' => function ($ rule, $ action) {return date ( 'dm') === '31 -10 ' ; }],],],]; } Public function actionSpecialCallback () {return $ this -> render ( 'happy-halloween'); }}

Контроль доступу на основі ролей (RBAC)

Управління доступом на основі ролей (RBAC) забезпечує простий, але потужний централізований контроль доступу. Будь ласка, зверніться до Wikipedia для отримання інформації про порівняння RBAC з іншими, більш традиційними, системами контролю доступу.

Yii реалізує загальну ієрархічну RBAC, слідуючи NIST RBAC model . Забезпечується функціональність RBAC через компонент додатка authManager .

Використання RBAC складається з двох частин. Перша частина - це створення RBAC даних авторизації, і друга частина - це використання даних авторизації для перевірки доступу в тому місці, де це потрібно.

Для полегшення подальшого опису, ми спочатку введемо деякі основні поняття RBAC.

Основні концепції

Роль являє собою набір дозволів (permissions) (наприклад, створення повідомлення, оновлення повідомлення). Роль може бути призначена на одного або багатьох користувачів. Щоб перевірити, чи має користувач вказані дозволи, ми повинні перевірити, чи призначена користувачеві роль, яка містить даний дозвіл.

З кожною роллю або дозволом може бути пов'язано правило (rule). Правило являє собою шматок коду, який буде виконуватися в ході перевірки доступу для визначення чи може бути застосована відповідна роль або дозвіл до активного користувача. Наприклад, дозвіл "оновлення поста" може мати правило, яке перевіряє чи є поточний користувач автором поста. Під час перевірки доступу, якщо користувач не є автором поста, він / вона буде вважатися не мають дозволу "оновлення поста".

І ролі, і дозволу можуть бути організовані в ієрархію. Зокрема, роль може містити інші ролі або дозволу; і дозволу можуть містити інші дозволи. Yii реалізує частково впорядковану ієрархію, яка включає в себе спеціальні дерева ієрархії. Роль може містити дозвіл, але зворотне не вірно.

Налаштування RBAC Manager

Перед визначенням авторизаційних даних і перевіркою прав доступу, ми повинні налаштувати компонент додатка authManager . Yii надає два типи менеджерів авторизації: yii \ rbac \ PhpManager і yii \ rbac \ DbManager . Перший використовує файл з PHP скриптом для зберігання даних авторизації, другий зберігає дані в базі даних. Ви можете використовувати перший, якщо ваше додаток не вимагає занадто динамічного управління ролями та дозволами.

Налаштування authManager за допомогою PhpManager

Наступний код показує як налаштувати в конфігурації програми authManager з використанням класу yii \ rbac \ PhpManager :

return [ 'components' => [ 'authManager' => [ 'class' => 'yii \ rbac \ PhpManager',],],];

Тепер authManager може бути доступний через \ Yii :: $ app-> authManager.

Зауваження: За умовчанням, yii \ rbac \ PhpManager зберігає дані RBAC в файлах в директорії @ app / rbac /. Переконайтеся що дана директорія і файли в них доступні для запису Web сервера, якщо ієрархія дозволів повинна змінюватися онлайн.

Налаштування authManager за допомогою DbManager

Наступний код показує як налаштувати в конфігурації програми authManager з використанням класу yii \ rbac \ DbManager :

return [ 'components' => [ 'authManager' => [ 'class' => 'yii \ rbac \ DbManager',],],];

DbManager використовує чотири таблиці для зберігання даних:

  • itemTable : Таблиця для зберігання авторизаційних елементів. За замовчуванням "auth_item".
  • itemChildTable : Таблиця для зберігання ієрархії елементів. За замовчуванням "auth_item_child".
  • assignmentTable : Таблиця для зберігання призначень елементів авторизації. За замовчуванням "auth_assignment".
  • ruleTable : Таблиця для зберігання правил. За замовчуванням "auth_rule".

Перш ніж ви почнете використовувати цей менеджер, вам потрібно створити таблиці в базі даних. Щоб зробити це, ви можете використовувати міграцію зберігається в файлі @ yii / rbac / migrations:

yii migrate --migrationPath = @ yii / rbac / migrations

Тепер authManager може бути доступний через \ Yii :: $ app-> authManager.

Створення даних авторизації

Для створення даних авторизації потрібно виконати наступні завдання:

  • визначення ролей і дозволів;
  • установка відносин між ролями та правами доступу;
  • визначення правил;
  • зв'язування правил з ролями та дозволами;
  • призначення ролей користувачам.

Залежно від вимог до гнучкості авторизації перераховані завдання можуть бути виконані різними шляхами.

Якщо ієрархія прав не змінюється, і кількість користувачів зафіксовано, ви можете створити консольную команду , Яка буде раз форматувати дані через APIs, що надається authManager:

<? Php namespace app \ commands; use Yii; use yii \ console \ Controller; class RbacController extends Controller {public function actionInit () {$ auth = Yii :: $ app -> authManager; $ CreatePost = $ auth -> createPermission ( 'createPost'); $ CreatePost -> description = 'Create a post'; $ Auth -> add ($ createPost); $ UpdatePost = $ auth -> createPermission ( 'updatePost'); $ UpdatePost -> description = 'Update post'; $ Auth -> add ($ updatePost); $ Author = $ auth -> createRole ( 'author'); $ Auth -> add ($ author); $ Auth -> addChild ($ author, $ createPost); $ Admin = $ auth -> createRole ( 'admin'); $ Auth -> add ($ admin); $ Auth -> addChild ($ admin, $ updatePost); $ Auth -> addChild ($ admin, $ author); $ Auth -> assign ($ author, 2); $ Auth -> assign ($ admin, 1); }}

Примітка: Якщо ви використовуєте шаблон проекту advanced, RbacController необхідно створити в директорії console / controllers і змінити простір імен на console \ controllers.

Після виконання команди yii rbac / init ми отримаємо наступну ієрархію:

Автор може створювати пост, адміністратор може оновлювати пост і робити все, що може робити автор.

Якщо ваш додаток дозволяє реєструвати користувачів, то вам необхідно відразу призначати ролі цим новим користувачам. Наприклад, для того, щоб все користувачі могли стати авторами в розширеному шаблоні проекту, ви повинні змінити frontend \ models \ SignupForm :: signup () як показано нижче:

public function signup () {if ($ this -> validate ()) {$ user = new User (); $ User -> username = $ this -> username; $ User -> email = $ this -> email; $ User -> setPassword ($ this -> password); $ User -> generateAuthKey (); $ User -> save (false); $ Auth = Yii :: $ app -> authManager; $ AuthorRole = $ auth -> getRole ( 'author'); $ Auth -> assign ($ authorRole, $ user -> getId ()); return $ user; } Return null; }

Для додатків, що вимагають комплексного контролю доступу з динамічно оновлюються даними авторизації, існують спеціальні інтерфейси (так звані адмін-панелі), які можуть бути розроблені з використанням API, пропонованого authManager.

Використання правил

Як згадано вище, правила додають додаткові обмеження на ролі і дозволу. Правила - це класи, що розширюють yii \ rbac \ Rule . Вони повинні реалізовувати метод execute () . В ієрархії, створеної нами раніше, автор не може редагувати свій пост. Давайте виправимо це. Спочатку ми повинні створити правило, що перевіряє що користувач є автором поста:

namespace app \ rbac; use yii \ rbac \ Rule; class AuthorRule extends Rule {public $ name = 'isAuthor'; public function execute ($ user, $ item, $ params) {return isset ($ params [ 'post'])? $ Params [ 'post'] -> createdBy == $ user: false; }}

Правило вище перевіряє, що post був створений $ user. Ми створимо спеціальний дозвіл updateOwnPost в команді, яку ми використовували раніше:

$ Auth = Yii :: $ app -> authManager; $ Rule = new \ app \ rbac \ AuthorRule; $ Auth -> add ($ rule); $ UpdateOwnPost = $ auth -> createPermission ( 'updateOwnPost'); $ UpdateOwnPost -> description = 'Update own post'; $ UpdateOwnPost -> ruleName = $ rule -> name; $ Auth -> add ($ updateOwnPost); $ Auth -> addChild ($ updateOwnPost, $ updatePost); $ Auth -> addChild ($ author, $ updateOwnPost);

Тепер ми маємо наступну ієрархію:

Перевірка доступу

З готовими авторизаційними даними перевірка доступу - це просто виклик методу yii \ rbac \ ManagerInterface :: checkAccess () . Так як більшість перевірок доступу відносяться до активного користувача, для зручності Yii надає скорочений метод yii \ web \ User :: can () , Який можна використовувати як показано нижче:

if (\ Yii :: $ app -> user-> can ( 'createPost')) {}

Якщо поточний користувач Jane з ID = 1, ми почнемо з createPost і спробуємо дістатися до Jane:

Для того щоб перевірити, чи може користувач оновити пост, нам треба передати додатковий параметр, необхідний для правила AuthorRule, описаного раніше:

if (\ Yii :: $ app -> user-> can ( 'updatePost', [ 'post' => $ post])) {}

Ось що відбувається якщо поточним користувачем є John:

Ми починаємо з updatePost і переходимо до updateOwnPost. Для того щоб це відбулося, правило AuthorRule має повернути true при виклику методу execute. Метод отримує $ params, переданий при виклику методу can, значення якого дорівнює [ 'post' => $ post]. Якщо все правильно, ми побачимо, що author прив'язаний до John.

У разі Jane це трохи простіше, тому що вона admin:

Є кілька способів реалізувати авторизацію в контролері. Якщо вам необхідні окремі права на додавання і видалення, то перевірку варто робити в кожній дії. Ви можете або використовувати умова вище в кожному методі дії, або використовувати yii \ filters \ AccessControl :

public function behaviors () {return [ 'access' => [ 'class' => AccessControl :: className (), 'rules' => [[ 'allow' => true, 'actions' => [ 'index'] , 'roles' => [ 'managePost'],], [ 'allow' => true, 'actions' => [ 'view'], 'roles' => [ 'viewPost'],], [ 'allow' => true, 'actions' => [ 'create'], 'roles' => [ 'createPost'],], [ 'allow' => true, 'actions' => [ 'update'], 'roles' => [ 'updatePost'],], [ 'allow' => true, 'actions' => [ 'delete'], 'roles' => [ 'deletePost'],],],],]; }

Якщо права на все CRUD операції видаються разом, то краще рішення в цьому випадку - завести один дозвіл на зразок managePost і перевіряти його в yii \ web \ Controller :: beforeAction () .

Використання ролі за замовчуванням

Роль за умовчанням - це роль, яка неявно присвоюється всім користувачам. виклик методу yii \ rbac \ ManagerInterface :: assign () не потрібно, і авторизовані дані не містять інформації про призначення.

Роль за умовчанням зазвичай пов'язують з правилом, що визначає до якої ролі належить кожен користувач.

Ролі за замовчуванням зазвичай використовуються в додатках, які вже мають якийсь опис ролей. Для прикладу, додаток може мати стовпець "group" в таблиці користувачів, і кожен користувач належить до якоїсь групи. Якщо кожна група може бути порівняна ролі в моделі RBAC, ви можете використовувати роль за замовчуванням для автоматичного призначення кожному користувачеві ролі RBAC. Давайте використаємо приклад, щоб зрозуміти як це можна зробити.

Припустимо що в таблиці користувачів у вас є стовпець group, в якому значення 1 представляє групу "адміністратор", а 2 - групу "автор". Ви плануєте мати дві RBAC ролі: admin і author, що представляють дозволу для двох відповідних груп. Ви можете налаштувати дані ролі як показано нижче.

namespace app \ rbac; use Yii; use yii \ rbac \ Rule; class UserGroupRule extends Rule {public $ name = 'userGroup'; public function execute ($ user, $ item, $ params) {if (! Yii :: $ app -> user-> isGuest) {$ group = Yii :: $ app -> user-> identity-> group; if ($ item -> name === 'admin') {return $ group == 1; } Elseif ($ item -> name === 'author') {return $ group == 1 || $ Group == 2; }} Return false; }} $ Auth = Yii :: $ app -> authManager; $ Rule = new \ app \ rbac \ UserGroupRule; $ Auth -> add ($ rule); $ Author = $ auth -> createRole ( 'author'); $ Author -> ruleName = $ rule -> name; $ Auth -> add ($ author); $ Admin = $ auth -> createRole ( 'admin'); $ Admin -> ruleName = $ rule -> name; $ Auth -> add ($ admin); $ Auth -> addChild ($ admin, $ author);

Зверніть увагу, так як "author" доданий як дочірня роль до "admin", отже в реалізації методу execute () класу правила ви повинні враховувати цю ієрархію. Саме тому для ролі "author" метод execute () поверне істину, якщо користувач належить до груп 1 або 2 (це означає, що користувач знаходиться в групі адміністраторів або авторів)

Далі налаштуємо authManager за допомогою перерахування ролей у властивості yii \ rbac \ BaseManager :: $ defaultRoles :

return [ 'components' => [ 'authManager' => [ 'class' => 'yii \ rbac \ PhpManager', 'defaultRoles' => [ 'admin', 'author'],],],];

Тепер, якщо ви виконаєте перевірку доступу, для обох ролей admin і author буде виконана перевірка правила, асоційованого з ними. Якщо правило поверне істину, це буде означати, що роль застосовується до активного користувача. На підставі правила, реалізованого вище: якщо користувач входить в групу 1, користувачеві буде призначена роль admin; і якщо значення group одно 2, буде застосована роль author.

Опція roles містить знак питання?
Опція roles містить знак питання?
Опція roles містить знак питання?
Категории
  • Биология
  • Математика
  • Краеведению
  • Лечебная
  • Наука
  • Физике
  • Природоведение
  • Информатика
  • Новости

  • Новости
    https://banwar.org/
    Наша взаимовыгодная связь https://banwar.org/. Запустив новый сайт, "Пари Матч" обещает своим клиентам незабываемый опыт и возможность выиграть крупные суммы.


    Наши клиенты
    Клиенты

    Быстрая связь

    Тел.: (044) 587-84-78
    E-mail: [email protected]

    Имя:
    E-mail:
    Телефон:
    Вопрос\Комментарий: