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

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

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

Авторизація - це процес перевірки того, що користувач має достатньо прав, щоб виконати якісь дії. 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 містить знак питання?
Категории
  • Биология
  • Математика
  • Краеведению
  • Лечебная
  • Наука
  • Физике
  • Природоведение
  • Информатика
  • Новости

  • Новости
    Подготовка к ЕГЭ по математике
    Статьи Опубликовано: 05.10.2017 Подготовка к ЕГЭ по МАТЕМАТИКЕ. 1 часть. Эффективный курс подготовки. Вы находитесь на сайте www.ege-ok.ru - Подготовка к ЕГЭ по математике. Меня зовут Инна Владимировна

    Куда поступить с обществознанием, русским и математикой
    Статьи Опубликовано: 06.10.2017 Сдача ЕГЭ. Куда поступать? Обществознание считается одним из самых популярных предметов, которые выпускники сдают на ЕГЭ. Ввиду высокого рейтинга дисциплины Рособрнадзор

    Сайт Майер Елены - ЕГЭ по математике
    Планируется проведение двух отдельных экзаменов – базового и профильного. Кому сдавать базовый ЕГЭ по математике? Базовый ЕГЭ организуется для выпускников, изучающих математику для общего развития

    ГДЗ решебник по математике 4 класс
    Извините, тут пока ничего нет ((( Решебник по математике 4 класс (Истомина Н.Б.) – не просто возможность быстро выполнить домашнее задание для учащегося, но и способ разобраться в труднорешаемых задачах.

    ГДЗ по математике 1 класс Самсонова самостоятельные работы
    Решебник по математике за 1 класс автора Самсоновой Л.Ю. 2012 года издания. Данное пособие предлагает готовые решения на разнообразные упражнения, направленные на активизацию всего учебного процесса. Здесь

    Для этой работы нужна математика
    Слотов: 956 Рулеток: 7 Лицензия: Pragmatic Play, Microgaming, ELK, Yggdrasil, Habanero, Amatic, Isoftbet, Netent, Rival, Igrosoft, Quickspin. Игры: Автоматы, Покер, Рулетки. Всего 963 Отдача: 98% Бонус

    Веселые задачи по математике 2 класс
    Во время занятий для того, чтобы немного переключить внимание школьников, но при этом не уйти от предмета, можно давать шутливые задачи на сообразительность. Буду пополнять коллекцию таких задач. Дополнительная

    Функция экспонента в Excel
    Одной из самых известных показательных функций в математике является экспонента. Она представляет собой число Эйлера, возведенное в указанную степень. В Экселе существует отдельный оператор, позволяющий

    ЕГЭ по математике 2018
    ЕГЭ по математике, наравне с русским языком , – обязательный экзамен для сдачи выпускниками 11-х классов. По статистике он самый сложный. Мы предлагаем ознакомиться с общей информацией об экзамене и

    Секреты эффективной и быстрой подготовки ко второй части ОГЭ по математике.
    Уважаемые девятиклассники, настоящие или будущие! Часто от вас приходится слышать следующие вопросы. Легко ли подготовиться к заданиям второй части ОГЭ по математике? Сколько для этого понадобится


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

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

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

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