Як створити адміністративну панель з ролями та дозволами на основі RBAC за допомогою Permit.io та Flask

Якщо у користувача немає дозволу на виконання певної дії, він не повинен мати доступу до неї. Дізнайтеся, як реалізувати управління доступом на основі ролей (Role-based access control, RBAC) для панелі адміністрування системи управління співробітниками за допомогою Permit.io та Flask.

pic

Іконки з Icons8

Управління доступом на основі ролей (RBAC) — це механізм авторизації або контролю доступу, який ставить питання «Хто ти?» і перевіряє «Що ти маєш право робити?» у системі або додатку.

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

Permit.io, сервіс авторизації як послуга (authorization-as-a-service), допомагає полегшити управління ролями та дозволами. Ви зосереджуєтеся на більш складних функціях, а Permit.io займається управлінням доступом на основі ролей для вас.

Додаток: система управління співробітниками

Система управління співробітниками є організаційною структурою, яка включає співробітників та їх ролі в компанії.

Такий тип системи охоплює адміністративні процеси, пов’язані з управлінням співробітниками, такі як перегляд записів співробітників, моніторинг відвідуваності, відпусток, робочих годин та понаднормових, набір персоналу, введення в компанію, розрахунок зарплати, податкові утримання і багато іншого.

Наша система управління співробітниками не включатиме всі функції, перелічені вище, а складатиметься лише з двох ресурсів (департаменти та співробітники), де ми використаємо Permit.io для впровадження доступу на основі ролей до інформації про співробітників/департаменти.

Ось огляд ролей, які буде включати наша система:

  • Роль адміністратора: Ця роль має необмежений доступ. Вона має дозвіл на виконання операцій CRUD (створення, читання, оновлення, видалення) для ресурсів департаментів та співробітників.
  • Роль працівника: Ця роль має дозвіл тільки на перегляд департаментів та співробітників.

Нижче наведена детальна розбивка ролей та дій для ресурсів departments та employees:

Попередні вимоги

Для того щоб йти за цим підручником, необхідно мати:

  • Обліковий запис permit.io з уже створеним проєктом. Цей підручник використовує проєкт із назвою “employee management” та підключенням до середовища “production”.
  • Обліковий запис Auth0 з уже налаштованим додатком. Цей підручник використовує додаток Auth0 з входом за електронною поштою та паролем, а також увімкненим входом через Google. Також використовується “непостійна” сесія.
  • Встановлений Docker на вашому комп’ютері для розгортання точки прийняття рішень щодо політики Permits.
  • Встановлені Git та Poetry (для управління залежностями) на вашому комп’ютері.

Код, що використовується в цьому підручнику, можна знайти в цьому репозиторії GitHub.

Налаштування додатку

Основна мета — реалізувати управління доступом на основі ролей за допомогою Permit.io у додатку Flask.
Щоб одразу перейти до Permit.io, Flask-додаток для цієї статті вже доступний на GitHub.

Клонуйте додаток на свій локальний комп'ютер та відкрийте його у вашому редакторі коду за допомогою таких команд:

Клонування репозиторію з GitHub

Ось розбір структури файлів додатку:

Перегляд структури файлів

Flask-додаток використовує Poetry для управління залежностями та інтегрує SQLAlchemy для роботи з базою даних.

Створіть Poetry shell і встановіть всі залежності:

Активуйте віртуальне середовище та встановіть усі залежності

Заповніть ключі у файлі .env проекту їх відповідними значеннями. Це необхідно для налаштування підпису сесії для Flask і Auth0 як вашого провайдера аутентифікації.

Зробіть наступне:

  • Використовуйте RandomKeygen для генерації ключа, який буде використано як ваш SECRET_KEY. Інструмент для генерації випадкових ключів можна обирати за вашим бажанням.
  • Додайте URL зворотного виклику — http://localhost:5000/login/callback як ваш Дозволений Callback URL та http://localhost:5000 як ваш Дозволений Logout URL в налаштуваннях вашого додатка в Auth0.
  • Отримайте ваші AUTH0_DOMAIN, AUTH0_CLIENT_ID, і AUTH0_CLIENT_SECRET з налаштувань додатка в Auth0 та додайте їх як значення для відповідних ключів у файлі .env.

Після заповнення файлу .env ви можете запустити ваш Flask-додаток. Для цього використовуйте наступну команду:

Запуск Flask-додатка

Це запустить Flask-додаток на localhost:5000, де вам буде запропоновано увійти для перегляду головної сторінки.

pic

Перегляд вікна входу в Auth0

Натисніть на Продовжити через Google, щоб увійти через ваш обліковий запис Google. Після успішного входу ви повинні бути перенаправлені на головну сторінку:

pic

Перегляд головної сторінки Flask-додатка

На цьому етапі ваш Flask-додаток налаштований і готовий до інтеграції з Permit.io для авторизації.

Створення ресурсів і ролей в Permit.io

Перед тим як почати впроваджувати Permit.io у ваш код, необхідно спершу створити необхідні ресурси, дії та ролі в вашій панелі керування Permit.io.

Однак спочатку підтвердіть ваш проект та середовище в панелі керування Permit.io. Це допоможе вам переконатися, що ви працюєте з правильним проектом і середовищем. Натисніть на опцію Проєкти на лівій панелі, як показано нижче:

pic

Підтвердження проекту та середовища в Permit.io

Зі скріншоту вище видно, що у цій статті використовується проект з назвою employee management та підключення до середовища production.

Після підтвердження проекту та середовища, ви можете переходити до створення ваших ресурсів. Натисніть на опцію Політика на лівій панелі та виберіть вкладку Ресурси.

Ви створите ресурси departments та employees без дій. Це тому, що ви додасте свої власні дії (з кастомними іменами) пізніше.

pic

Створення ресурсу департаментів

pic

Перегляд ресурсів

Після створення ваших ресурсів потрібно додати дії, що визначають конкретні операції, які можна виконувати з вашими ресурсами.
Це включає дії “create_department, view_department, update_department, delete_department" для вашого ресурсу "departments", та “create_employee, view_employee, update_employee, delete_employee" для вашого ресурсу "employees".

На вкладці Ресурси додайте дії для відповідних ресурсів, натиснувши на значок + в крайньому правому куті відповідного рядка ресурсу:

pic

Додавання дій

Відкриється діалогове вікно. У цьому вікні визначте відповідні дії для ваших ресурсів, додаючи назву вашої дії. Наприклад, дія create_employee для ресурсу employee:

pic

Додавання дій

Ваша вкладка Ресурси повинна виглядати так після додавання всіх дій для ваших ресурсів:

pic

Перегляд ресурсів та відповідних дій

Створіть наступні ролі на вкладці Ролі:

  • administrator з необмеженим доступом (тобто виконання всіх дій для всіх ресурсів).
  • worker з дозволом лише на перегляд наших ресурсів.

pic

Перегляд ролей "administrator" та "worker"

Натисніть на вкладку Policy Editor, щоб переглянути ваші ресурси. Дайте ролі адміністратора необмежений доступ, позначивши всі дії для обох ресурсів. Надалі надайте ролі працівника тільки права на перегляд обох ресурсів і збережіть зміни:

pic

Вибір дій для ролі адміністратора

pic

Вибір дій для ролі працівника

Після того, як ваші ресурси, дії та ролі будуть створені та визначені, ви готові підключити ваш додаток до бекабенду Permit.

Встановлення SDK Permit та розгортання PDP

SDK Permit є містком між вашим додатком і платформою Permit.io. Для застосування дозволів необхідно встановити SDK Permit у вашому проєкті. Перейдіть до вашого коду та виконайте наступну команду в Poetry shell:

Встановлення SDK Permit

Це встановить SDK Permit та всі залежності, необхідні для коректної роботи SDK Permit.

Далі розгорніть Policy Decision Point (PDP) від Permit. PDP буде служити центральним механізмом для оцінки та застосування вашої політики авторизації. Однак перед розгортанням PDP, вам необхідно отримати API-ключ середовища, з яким ви працюєте (у цьому випадку середовище production). Саме за допомогою цього API-ключа PDP буде аутентифікувати себе з вашим проектом на Permit.io та здійснювати безпечну комунікацію з бекендом Permit.

Перейдіть до вашої панелі керування Permit.io і скопіюйте API-ключ для середовища production вашого проекту.
API-ключ можна знайти в меню з трьома крапками поруч з розділом Production, як показано на зображенні нижче.

pic

Копіювання API-ключа

Вставте ключ у зручне для вас місце, щоб мати доступ до нього, а потім у вашому терміналі витягніть контейнерну образу PDP від Permits з DockerHub:

Отримання контейнеру PDP Permit

Запустіть образ PDP, замінивши `` на ваш фактичний API-ключ:

Запуск контейнера PDP Permit

Відвідайте URL — http://localhost:7766 у вашому улюбленому веб-браузері, щоб переглянути статус розгорнутого PDP. Якщо ви побачите нижчевказаний вивід, ви готові переходити до вашого коду та почати використовувати SDK Permit для застосування дозволів у вашому Flask-додатку.

pic

Перегляд статусу PDP

Застосування дозволів за допомогою SDK Permit

Необхідно виконати кілька кроків, щоб почати застосовувати дозволи на ваших маршрутах Flask. Це включає ініціалізацію SDK Permit, створення точки застосування політики, синхронізацію автентифікованих користувачів, призначення ролей синхронізованим користувачам і виклик точки застосування політики на ваших маршрутах.

По-перше, додайте наступний рядок у файл .env вашого проєкту:

Додайте API-ключ PDP як змінну середовища

У файлі app.py імпортуйте клас Permit з пакету permit та ініціалізуйте SDK Permit:

Ініціалізація SDK Permit

Створіть декоратор, який буде виконувати роль вашої точки застосування політики. Цей декоратор перевірятиме, чи має користувач необхідні дозволи для виконання операції з ресурсом, викликаючи SDK Permit і застосовуючи контроль доступу на основі результату. SDK Permit повертає результат як логічне значення: якщо воно повертає True, Permit надає доступ, в іншому випадку доступ користувачу буде відмовлено.

Додайте наступні фрагменти коду у ваш файл app.py:

Створення точки застосування політики

Після створення класу декоратора необхідно синхронізувати автентифікованих користувачів Auth0 і призначити їм ролі у вашій конфігурації Permit. Це дозволить Permit розпізнавати автентифікованих користувачів і надавати їм відповідні дозволи для доступу до ресурсів.
Оновіть вашу функцію зворотного виклику для входу, щоб вона виглядала так:

Синхронізація автентифікованих користувачів і призначення ролей

Ця функція зворотного виклику отримує електронну пошту автентифікованого користувача з Auth0, синхронізує її з Permit і призначає необхідну роль, таку як administrator в цьому прикладі.

Застосуйте декоратор @check_permission до всіх маршрутів, що стосуються ресурсу “departments”, зокрема після їх визначень маршруту:

  • @app.route('/add_department', methods=['GET', 'POST'])
@check_permission(resource="departments", action_name="create_department")
  • @app.route('/department/int:department_id')
@check_permission(resource="departments:{department_id}", action_name="view_department")
  • @app.route('/update_department/int:department_id', methods=['GET', 'POST'])
@check_permission(resource="departments:{department_id}", action_name="update_department")
  • @app.route('/delete_department/int:department_id', methods=['GET', 'POST'])
@check_permission(resource="departments:{department_id}", action_name="delete_department")

Те ж саме зробіть для маршрутів, що стосуються ресурсу “employees”:

  • @app.route('/add_employee', methods=['GET', 'POST'])
@check_permission(resource="employees", action_name="create_employee")
  • @app.route('/employee/int:employee_id')
@check_permission(resource="employees:{employee_id}", action_name="view_employee")
  • @app.route('/update_employee/int:employee_id', methods=['GET', 'POST'])
@check_permission(resource="employees:{employee_id}", action_name="update_employee")
  • @app.route('/delete_employee/int:employee_id', methods=['GET', 'POST'])
@check_permission(resource="employees:{employee_id}", action_name="delete_employee")

Тут декоратор перевіряє, чи має автентифікований користувач необхідні дозволи для виконання певних дій над визначеними ресурсами.

Тестування з'єднання

Запустіть ваш додаток і увійдіть знову. Після успішного входу ви повинні бути перенаправлені на домашню сторінку, як зазвичай. Для перевірки, що ваше з'єднання було успішним, ви повинні побачити автентифікованого користувача в вашій панелі керування користувачами Permit user management dashboard:

pic

Перегляд користувача в панелі керування користувачами Permit

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

pic

Додавання відділу

pic

Редагування користувача

Встановіть верхній рівень доступу на “worker” і збережіть зміни:

pic

Редагування користувача

pic

Редагування верхнього рівня доступу до worker

Тепер оновіть ваш додаток і спробуйте створити відділ, вам має бути відмовлено в доступі:

pic

Додавання відділу як worker

У ваших логах PDP ви повинні побачити деталі про рішення авторизації, включаючи ключ користувача, дію, яку він спробував виконати (наприклад, create_department), тип ресурсу (наприклад, departments) і причини, чому запит був відхилений (наприклад, відсутність відповідних правил або дозволів).

pic

Перегляд логів PDP

Висновок

У цій статті ви дізналися, як створювати ресурси на вашій панелі Permit. Ви також навчилися, як створювати дії для цих ресурсів і визначати ролі, які можуть виконувати ці дії. Крім того, ви дізналися, як встановити SDK Permit, запустити PDP Permit і виконати кроки для застосування вашого першого дозволу. Авторизація ще ніколи не була такою простою.
Permit — це справжня революція, якщо ви мене запитаєте, з користувацьким інтерфейсом, що легкий у використанні, та SDK для розробників з чіткою і зрозумілою документацією.

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

Дякую за прочитане, і щасливого кодування!

Перекладено з: How to Build an RBAC Permissioned Admin Dashboard with Permit.io and Flask

Leave a Reply

Your email address will not be published. Required fields are marked *