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!