Chapter 4: Security - A Brief Introduction

In the previous chapter, we created our first table intended to store business data. In a business application such as Odoo, one of the first questions to consider is who1 can access the data. Odoo provides a security mechanism to allow access to the data for specific groups of users.

Більш детально тему безпеки висвітлено в Обмеження доступу до даних. Цей розділ має на меті охопити мінімум, необхідний для нашого нового модуля.

Файли даних (CSV)

Odoo is a highly data driven system. Although behavior is customized using Python code, part of a module’s value is in the data it sets up when loaded. One way to load data is through a CSV file. One example is the list of country states which is loaded at installation of the base module.

"id","country_id:id","name","code"
state_au_1,au,"Australian Capital Territory","ACT"
state_au_2,au,"New South Wales","NSW"
state_au_3,au,"Northern Territory","NT"
state_au_4,au,"Queensland","QLD"
...
  • 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 models ['estate.property'] have no access rules...

Якщо в моделі не визначено права доступу, Odoo визначає, що жоден користувач не може отримати доступ до даних. Про це навіть повідомляється в журналі:

WARNING rd-demo odoo.modules.loading: The models ['estate.property'] have no access rules in module estate, consider adding some, like:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink

Права доступу визначаються як записи моделі 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.

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

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

It’s now time to finally interact with the UI!

1

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

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