odoo权限
一.了解odoo权限体系
# Odoo访问权限通过 '安全组' 进行配置-----> 给组分配权限 ----->为用户分配组
# 针对 已有模型 ,可以沿用存在的权限组
# 针对 新建模型, 必须要重新设置权限组和访问规则
# 通俗:
odoo 权限分为: 权限组 和 访问记录 和 ACL
权限组至少包含:用户和管理员权限
二. 权限组
<record id="group_library_librarian" model="res.groups">
<field name="name">Librarians</field>
<field name="category_id"
ref="base.module_category_library"/>
<field name="implied_ids" eval="[(4,
ref('group_library_user'))]"/>
<field name="users" eval="[(4, ref('base.user_admin'))]"/>
</record>
###
name:组的显示名称
category_id 这是对应分类的引用,用于用户表单中组织分组
implied_ids 继承权限的其他组
users : 属于该组的用户
####
菜单(menu_access字段):指定组所能访问的菜单项
视图(view_access字段):指定组所能访问的UI界面视图
访问权限(model_access字段):指定组所能访问的模型,在为模型添加访问权限一节中会进行详述
访问规则(rule_groups字段):指定一些应用于组的记录级访问规则,在限制模型中字段的访问一节中会进行详述
提示(comment记录):这是组的描述或注释文本
三.权限访问控制规则 ACL
CSV文件中的字段如下:
id:这是针对这一规则的XML ID内部标识符。该模块中的任何唯一名称都可以,但按惯例使用access_<model>_<group>。
name:这是访问规则的标题。常用实践是使用access.<model>.<group>这一名称。
model_id:id:这是该模型的XML ID。Odoo使用model_<name>格式对这些模型自动分配这种类型的ID,使用带下划线而非点号的模型名称。如果模弄是在另一个模块中创建的,则需要完整的包含模块名称的有效完整XML ID。
group_id:id:这是针对用户组的XML ID。如果留空,它应用于所有用户。base模块中提供了一些基本用户级,比如针对所有用户的base.group_user和针对管理员用户的base.group_system。其它应用可以添加它们自己的用户组。
perm_read:前述组中成员可以读取模型记录。它接收两个值:0或1。使用0来限制模型上的读权限,1来提供读权限。
perm_write:前述组中成员可以更新模型记录。它接收两个值:0或1。使用0来限制模型上的写权限,1来提供写权限。
perm_create:前述组中成员可以在该模型中新增记录。它接收两个值:0或1。使用0来限制模型上的创建权限,1来提供创建的权限。
perm_unlink:前述组中成员可以在该模型中删除记录。它接收两个值:0或1。使用0来限制模型上的删除权限,1来提供删除的权限。
四.限制模型中字段的访问
is_public =fields.Boolean(groups='my_library.group_library_librarian')
private_notes =fields.Text(groups='my_library.group_library_librarian')
# 如果使用没有系统配置权限的用户登录的话,图书表单中就不会显示该字段
# groups 属性的字段进行了特殊处理。 检查用户是否属于属性中指定的用户组。
不属于指定的用户组,Odoo在用户界面删除该字段,限制对该字段的ORM操作
# 注意
1. 不仅仅是隐藏,ORM也无法操作。 XML-RPC和JSON-RPC调用不到
2. @api.onchange方法调用到该 字段则会抛出访问异常
五.使用记录规则限制记录的访问
<record model="ir.rule" id="library_book_all_rule">
<field name="name">Library: see all books</field>
<field name="model_id" ref="model_library_book"/>
<field name="groups"
eval="[(4,
ref('my_library.group_library_librarian'))]"/>
<field name="domain_force">[(1, '=', 1)]</field>
</record>
####
名称(name):针对规则的描述性标题。
对象(model_id):对规则所应用模型的引用。
组(groups):规则所应用的安全组。如未指定安全组,规则应视作全局并使用不同的方式进行应用(继续阅读本节来学习有关组的更多知识)。
域(domain):域表达式用于过滤记录。该记录将仅用于对这些过滤的记录进行应用。
六.用户视图展示权限
# 1. 重写 res.config.settings配置模型,添加新字段
group_release_dates = fields.Boolean(
"Manage book release dates",
group='base.group_user',
implied_group='my_library.group_release_dates', # 依赖的权限组
)
module_note = fields.Boolean("Install Notes app")
# 2. 视图继承,并添加新的字段
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_general_config_library" model="ir.ui.view">
<field name="name">Configuration: add Library options</field>
<field name="model">res.config.settings</field>
<field name="inherit_id"
ref="base_setup.res_config_settings_view_form"/>
<field name="arch" type="xml">
<div id="business_documents" position="before">
<h2>Library</h2>
<div class="row mt16 o_settings_container">
<!-- Release Dates option -->
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="group_release_dates" class="oe_inline"/>
</div>
<div class="o_setting_right_pane">
<label for="group_release_dates"/>
<div class="text-muted">
Enable relase date feature on books
</div>
</div>
</div>
<!-- Release Dates option -->
<div class="col-12 col-lg-6 o_setting_box">
<div class="o_setting_left_pane">
<field name="module_note" class="oe_inline"/>
</div>
<div class="o_setting_right_pane">
<label for="module_note"/>
<div class="text-muted">
Install note module
</div>
</div>
</div>
</div>
</div>
</field>
</record>
</odoo>
七.以超级用户访问记录集
sudo() # 超级用户 忽略所有访问规则
八.组来隐藏元素和菜单
# 1. 隐藏 form表单 header,有这个权限组的人才能看到
<header groups="my_library.group_library_user">
# 2. menuitem 同理
<menuitem name="Book Categories"
id="library_book_category_menu"
parent="library_base_menu"
action="library_book_category_action"
groups="my_library.group_library_librarian"/>