Розділ 4: Безпека – короткий вступ¶
У попередній розділ ми створили нашу першу таблицю, призначену для зберігання бізнес-даних. У бізнес-застосунку, такому як Odoo, одне з перших питань, яке слід розглянути, це who1 може отримати доступ до даних. Odoo надає механізм безпеки, що дозволяє доступ до даних певним групам користувачів.
Більш детально тему безпеки висвітлено в Обмеження доступу до даних. Цей розділ має на меті охопити мінімум, необхідний для нашого нового модуля.
Файли даних (CSV)¶
Odoo - це система, що значною мірою орієнтована на дані. Хоча поведінка налаштовується за допомогою коду Python, частина цінності модуля полягає в даних, які він налаштовує під час завантаження. Один із способів завантаження даних - через CSV-файл. Одним із прикладів є список штатів країн, який завантажується під час встановлення модуля base.
"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є external identifier. Його можна використовувати для посилання на запис (не знаючи його ідентифікатора в базі даних).country_id:idпосилається на країну за допомогою її external identifier.name- це назва області.code- це код області.
Ці три поля визначені у res.country.state модель.
За умовами, файл, який імпортує дані, знаходиться в папці data модуля. Якщо дані стосуються безпеки, вони знаходяться в папці security. Коли дані пов’язані з представленнями та діями (ми розглянемо це пізніше), вони знаходяться в папці views. Крім того, усі ці файли мають бути оголошені у списку data у файлі __manifest__.py. Наш приклад файлу визначено у маніфесті базового модуля.
Також зауважте, що вміст файлів даних завантажується лише тоді, коли встановлено або оновлено модуль.
Попередження
Файли даних завантажуються послідовно відповідно до їх порядку у файлі __manifest__.py. Це означає, що якщо дані A посилаються на B, ви повинні переконатися, що B завантажується перед A.
У випадку областей країни ви помітите, що список країн завантажується перед список областей. Це тому, що області відносяться до країн.
Чому все це важливо для безпеки? Оскільки вся конфігурація безпеки моделі завантажується через файли даних, як ми побачимо в наступному розділі.
Права доступу¶
Довідка: документацію щодо цієї теми можна знайти в Права доступу.
Примітка
Ціль: у кінці цього розділу таке попередження більше не повинно з’являтися:
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є external identifier.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.
Порада: попередження в журналі дає вам більшість рішень ;-)
Перезапустіть сервер, і попередження повинно зникнути!
Нарешті настав час взаємодіяи з інтерфейсом користувача!