Управління правами доступу користувача побудовано на приналежності до певної групи. Для груп в Odoo існує спеціальна модель res.groups. Саме для групи визначаються права доступу. Група є аналогом поняття ролі в моделі RBAC (Управління доступом на основі ролей, рольова модель).
Для читачів, що незнайомі з теорією, слід пояснити: користувачеві спочатку не дано жодних прав, а всі права він отримує тільки призначенням йому однієї або декількох ролей.
В Odoo права доступу можуть видаватися на:
- операції з моделями даних
- доступ до самих даних
- доступ до меню
- доступ до відображення
- доступ на окремі поля
Для читачів, що незнайомі з теорією, слід пояснити: користувачеві спочатку не дано жодних прав, а всі права він отримує тільки призначенням йому однієї або декількох ролей.
В Odoo права доступу можуть видаватися на:
- операції з моделями даних
- доступ до самих даних
- доступ до меню
- доступ до відображення
- доступ на окремі поля
Алгоритм перевірки прав доступу до даних
Основний алгоритм виглядає наступним чином
Управління доступом до моделі
Управління доступом до моделі здійснюється через записи в модель ir.model.access, в якій визначається модель до якої регулюється доступ, група і чотири дії: читання, створення, зміна та видалення.
Детальніше про значення False
Для розуміння алгоритму дуже важливо підкреслити, що False в полі дії - це не заборона на виконання, а тільки лише інформація, що даний запис не регулює доступ до цієї дії. Таким чином дозвіл користувачеві буде дано, якщо це дію дозволено для всіх груп або хоча б для однієї з груп, до яких належить користувач.
Правила доступу
На відміну від прав доступу, правила обмежують доступ до даних. Тут треба підкреслити, що обмежують доступ до даних, а не до моделі. Таким чином можна обмежити дію прав доступу лише певною вибіркою даних. Наприклад, можна дати права на перегляд одних даних, а на редагування інших даних в тій самій моделі.
Взаємодія між правилами
Загальні правила (які не належать до групи) є обмеженнями, і їх не можна обійти. Правила, специфічні для групи, надають додаткові дозволи, але обмежені в загальних межах. Правила першої групи обмежують загальні правила, але можуть бути послаблені додатковими правилами групи.
Розгорнутий алгоритм:
- Загальні правила об'єднуються разом з логічним оператором AND і з результатом наступних кроків
- Правила, специфічні для групи, об'єднуються разом з логічним оператором OR
- Якщо користувач належить до кількох груп, результати з кроку 2 поєднуються з логічним оператором OR
Приклад: GLOBAL_RULE_1 AND GLOBAL_RULE_2 AND ( (GROUP_A_RULE_1 OR GROUP_A_RULE_2) OR (GROUP_B_RULE_1 OR GROUP_B_RULE_2) )
Про домен
Цей, на перший погляд, беззмістовний домен використовується для нівелювання обмежень, що накладаються іншими правилами від інших груп
Перевизначення стандартних правил доступу
При написанні модулів часто виникає ситуація, коли потрібно перевизначити домени, які встановлюються стандартними (базовими) модулями. В цьому випадку треба застосовувати тег function
<function name="write" model="ir.model.data">
<function name="search" model="ir.model.data">
<value eval="[('module', '=', 'project'), ('name', '=', 'project_comp_rule')]"/>
</function>
<value eval="{'noupdate': False}"/>
</function>
<record model="ir.rule" id="project.project_comp_rule">
<field name="domain_force">['|',
('invite_user_ids', '=', user.partner_id.id),
('company_id', 'child_of', [user.company_id.id])]
</field>
</record>