Розділ 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.

Порада: попередження в журналі дає вам більшість рішень ;-)

Перезапустіть сервер, і попередження повинно зникнути!

Настав час нарешті взаємодіяти з інтерфейсом користувача!

1

тобто який користувач Odoo (або група користувачів)

„unlink“ є еквівалентом „delete“