Розділ 5: Безпека - короткий вступ¶
У попередньому розділі ми створили нашу першу таблицю, призначену для зберігання бізнес-даних. У бізнес-програмі, такій як Odoo, одним із перших питань, яке потрібно розглянути, є те, хто 1 може отримати доступ до даних. Odoo надає механізм безпеки, щоб дозволити доступ до даних певним групам користувачів.
Більш детально тему безпеки висвітлено в Обмеження доступу до даних. Цей розділ має на меті охопити мінімум, необхідний для нашого нового модуля.
Файли даних (CSV)¶
Odoo - це система, яка значною мірою керується даними. Хоча поведінка налаштовується за допомогою коду на Python, частина цінності модуля полягає в даних, які він встановлює при завантаженні. Одним із способів завантаження даних є файл CSV. Одним з прикладів є список країн, який завантажується під час встановлення модуля base
.
"id","country_id:id","name","code"
state_us_1,us,"Alabama","AL"
state_us_2,us,"Alaska","AK"
state_us_3,us,"Arizona","AZ"
state_us_4,us,"Arkansas","AR"
...
id
є зовнішнім ідентифікатором. Його можна використовувати для посилання на запис (не знаючи його ідентифікатора в базі даних).country_id:id
посилається на країну за допомогою її зовнішнього ідентифікатора.name
- це назва області.code
- це код області.
Ці три поля визначені у ``res.country.state `` модель.
За умовами, файл, який імпортує дані, знаходиться в папці data
модуля. Якщо дані стосуються безпеки, вони знаходяться в папці security
. Коли дані пов’язані з представленнями та діями (ми розглянемо це пізніше), вони знаходяться в папці views
. Крім того, усі ці файли мають бути оголошені у списку data
у файлі __manifest__.py
. Наш приклад файлу визначено у маніфесті базового модуля.
Також зауважте, що вміст файлів даних завантажується лише тоді, коли встановлено або оновлено модуль.
Попередження
Файли даних завантажуються послідовно відповідно до їх порядку у файлі __manifest__.py
. Це означає, що якщо дані A
посилаються на B
, ви повинні переконатися, що B
завантажується перед A
.
У випадку областей країни ви помітите, що список країн завантажується перед списком областей <https://github.com/odoo/odoo/blob/e8697f609372cd61b045c4ee2c7f0fcfb496f58a/odoo/addons/base/__manifest__.py#L29>`__. Це тому, що області відносяться до країн.
Чому все це важливо для безпеки? Оскільки вся конфігурація безпеки моделі завантажується через файли даних, як ми побачимо в наступному розділі.
Права доступу¶
Довідка: документацію щодо цієї теми можна знайти в Права доступу.
Примітка
Ціль: у кінці цього розділу таке попередження більше не повинно з’являтися:
WARNING rd-demo odoo.modules.loading: The model estate.property has no access rules...
Якщо в моделі не визначено права доступу, Odoo визначає, що жоден користувач не може отримати доступ до даних. Про це навіть повідомляється в журналі:
WARNING rd-demo odoo.modules.loading: The model estate.property has no access rules, consider adding one. E.g. access_estate_property,access_estate_property,model_estate_property,base.group_user,1,0,0,0
Права доступу визначаються як записи моделі ir.model.access
. Кожне право доступу пов’язане з моделлю, групою (або без групи для глобального доступу) і набором дозволів: створення, читання, запис і від’єднання2. Такі права доступу зазвичай визначаються у файлі CSV під назвою ir.model.access.csv
.
Ось приклад для нашої попередньої test_model
:
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_test_model,access_test_model,model_test_model,base.group_user,1,0,0,0
id
є зовнішнім ідентифікатором.name
- це назваir.model.access
.model_id/id
посилається на модель, до якої застосовується право доступу. Стандартним способом посилання на модель єmodel_<model_name>
, де<model_name>
є_name
моделі з.
заміненим_
. Здається громіздким? Дійсно, це…group_id/id
посилається на групу, до якої застосовуються права доступу.perm_read,perm_write,perm_create,perm_unlink
: дозволи на читання, запис, створення та від’єднання
Exercise
Додайте права доступу.
Створіть файл ir.model.access.csv
у відповідній папці та визначте його у файлі __manifest__.py
.
Надайте дозволи на читання, запис, створення та від’єднання групи base.group_user
.
Порада: попередження в журналі дає вам більшість рішень ;-)
Перезапустіть сервер, і попередження повинно зникнути!
Настав час нарешті взаємодіяти з інтерфейсом користувача!