Якщо у користувача немає дозволу на виконання певної дії, він не повинен мати доступу до неї. Дізнайтеся, як реалізувати управління доступом на основі ролей (Role-based access control, RBAC) для панелі адміністрування системи управління співробітниками за допомогою Permit.io та Flask.
Іконки з 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, де вам буде запропоновано увійти для перегляду головної сторінки.
Перегляд вікна входу в Auth0
Натисніть на Продовжити через Google, щоб увійти через ваш обліковий запис Google. Після успішного входу ви повинні бути перенаправлені на головну сторінку:
Перегляд головної сторінки Flask-додатка
На цьому етапі ваш Flask-додаток налаштований і готовий до інтеграції з Permit.io для авторизації.
Створення ресурсів і ролей в Permit.io
Перед тим як почати впроваджувати Permit.io у ваш код, необхідно спершу створити необхідні ресурси, дії та ролі в вашій панелі керування Permit.io.
Однак спочатку підтвердіть ваш проект та середовище в панелі керування Permit.io. Це допоможе вам переконатися, що ви працюєте з правильним проектом і середовищем. Натисніть на опцію Проєкти на лівій панелі, як показано нижче:
Підтвердження проекту та середовища в Permit.io
Зі скріншоту вище видно, що у цій статті використовується проект з назвою employee management та підключення до середовища production.
Після підтвердження проекту та середовища, ви можете переходити до створення ваших ресурсів. Натисніть на опцію Політика на лівій панелі та виберіть вкладку Ресурси.
Ви створите ресурси departments
та employees
без дій. Це тому, що ви додасте свої власні дії (з кастомними іменами) пізніше.
Створення ресурсу департаментів
Перегляд ресурсів
Після створення ваших ресурсів потрібно додати дії, що визначають конкретні операції, які можна виконувати з вашими ресурсами.
Це включає дії “create_department
, view_department
, update_department
, delete_department
" для вашого ресурсу "departments", та “create_employee
, view_employee
, update_employee
, delete_employee
" для вашого ресурсу "employees".
На вкладці Ресурси додайте дії для відповідних ресурсів, натиснувши на значок + в крайньому правому куті відповідного рядка ресурсу:
Додавання дій
Відкриється діалогове вікно. У цьому вікні визначте відповідні дії для ваших ресурсів, додаючи назву вашої дії. Наприклад, дія create_employee
для ресурсу employee:
Додавання дій
Ваша вкладка Ресурси повинна виглядати так після додавання всіх дій для ваших ресурсів:
Перегляд ресурсів та відповідних дій
Створіть наступні ролі на вкладці Ролі:
administrator
з необмеженим доступом (тобто виконання всіх дій для всіх ресурсів).worker
з дозволом лише на перегляд наших ресурсів.
Перегляд ролей "administrator" та "worker"
Натисніть на вкладку Policy Editor, щоб переглянути ваші ресурси. Дайте ролі адміністратора необмежений доступ, позначивши всі дії для обох ресурсів. Надалі надайте ролі працівника тільки права на перегляд обох ресурсів і збережіть зміни:
Вибір дій для ролі адміністратора
Вибір дій для ролі працівника
Після того, як ваші ресурси, дії та ролі будуть створені та визначені, ви готові підключити ваш додаток до бекабенду 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, як показано на зображенні нижче.
Копіювання API-ключа
Вставте ключ у зручне для вас місце, щоб мати доступ до нього, а потім у вашому терміналі витягніть контейнерну образу PDP від Permits з DockerHub:
Отримання контейнеру PDP Permit
Запустіть образ PDP, замінивши `` на ваш фактичний API-ключ:
Запуск контейнера PDP Permit
Відвідайте URL — http://localhost:7766 у вашому улюбленому веб-браузері, щоб переглянути статус розгорнутого PDP. Якщо ви побачите нижчевказаний вивід, ви готові переходити до вашого коду та почати використовувати SDK Permit для застосування дозволів у вашому Flask-додатку.
Перегляд статусу 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:
Перегляд користувача в панелі керування користувачами Permit
Поверніться до вашого додатку Flask і додайте відділ. Ви повинні змогти це зробити, оскільки користувач в сесії має роль адміністратора:
Додавання відділу
Редагування користувача
Встановіть верхній рівень доступу на “worker” і збережіть зміни:
Редагування користувача
Редагування верхнього рівня доступу до worker
Тепер оновіть ваш додаток і спробуйте створити відділ, вам має бути відмовлено в доступі:
Додавання відділу як worker
У ваших логах PDP ви повинні побачити деталі про рішення авторизації, включаючи ключ користувача, дію, яку він спробував виконати (наприклад, create_department), тип ресурсу (наприклад, departments) і причини, чому запит був відхилений (наприклад, відсутність відповідних правил або дозволів).
Перегляд логів PDP
Висновок
У цій статті ви дізналися, як створювати ресурси на вашій панелі Permit. Ви також навчилися, як створювати дії для цих ресурсів і визначати ролі, які можуть виконувати ці дії. Крім того, ви дізналися, як встановити SDK Permit, запустити PDP Permit і виконати кроки для застосування вашого першого дозволу. Авторизація ще ніколи не була такою простою.
Permit — це справжня революція, якщо ви мене запитаєте, з користувацьким інтерфейсом, що легкий у використанні, та SDK для розробників з чіткою і зрозумілою документацією.
Якщо ви новачок в авторизації, ось блог-пост, який допоможе вам почати. Для більш детальної інформації про Permit, будь ласка, ознайомтесь з офіційною документацією.
Дякую за прочитане, і щасливого кодування!
Перекладено з: How to Build an RBAC Permissioned Admin Dashboard with Permit.io and Flask