在之前的文章中,我们创建了第一个用于存储业务数据的表。在 Odoo 这样的商业应用程序中,首先要考虑的问题之一是谁可以访问数据。Odoo 提供了一种安全机制,允许特定用户组访问数据。
本章旨在对权限有个最低要求对了解
数据文件(CSV)
Odoo 是一个高度数据驱动的系统。虽然行为是通过 Python 代码定制的,但模块的部分价值在于加载时设置的数据。加载数据的一种方式是通过 CSV 文件。其中一个例子就是在安装基础模块时加载的国家列表。
"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 使用外部标识符来指代国家。
- name 是国家的名称。
- code 是国家的代码。
这三个字段是定义中 res.country.state 模型中的(这里只需要了解一下):
class CountryState(models.Model):
_description = "Country state"
_name = 'res.country.state'
_order = 'code'
country_id = fields.Many2one('res.country', string='Country', required=True)
name = fields.Char(string='State Name', required=True,
help='Administrative divisions of a country. E.g. Fed. State, Departement, Canton')
code = fields.Char(string='State Code', help='The state code.', required=True)
按照惯例,导入数据的文件位于模块的数据文件夹中。当数据与安全相关时,它位于安全文件夹中。如果数据与视图和操作有关(我们将在后面介绍),则会放在视图文件夹中。此外,所有这些文件都必须在 __manifest__.py 文件的数据列表中声明。我们的示例文件定义在基础模块的清单中。
所以我们的模块目录结构现在是这样的:
请注意,只有在安装或更新模块时才会加载数据文件的内容。
为什么这些对安全性很重要?因为模型的所有安全配置都是通过数据文件加载的,我们将在下一节看到。
权限控制
当模型上没有定义访问权限时,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 模型的记录。每个访问权限都与一个模型、一个组(全局访问则无组)和一组权限相关联:创建、读取、写入和取消链接(unlink,"等同于 "删除)。这些访问权限通常定义在一个名为 ir.model.access.csv 的 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: 权限记录的唯一标识符。这在模块的数据文件中用于引用和修改权限记录。在你的例子中,它是
access_test_model
。 -
name: 权限的名称。这通常用于描述性文档和查找,没有技术上的影响。在这里,它也是
access_test_model
。 -
model_id/id: 关联的模型的外键。这指定了权限规则将应用于哪个模型。格式通常为
model_<model_name>
,在你的例子中是model_test_model
,这意味着权限将应用于test_model
模型。 -
group_id/id: 关联的用户组的外键。这指定了哪个用户组拥有这些权限。格式通常为
module_name.group_name
,在你的例子中是base.group_user
,表示这些权限适用于“内置用户”组的成员。 -
perm_read: 读权限。如果设置为
1
(或true
),则指定用户组的成员可以读取该模型的记录。在你的例子中,它被设置为1
,意味着用户可以读取test_model
的记录。 -
perm_write: 写权限。如果设置为
1
(或true
),则指定用户组的成员可以修改该模型的记录。在你的例子中,它被设置为0
(或false
),意味着用户不能修改test_model
的记录。 -
perm_create: 创建权限。如果设置为
1
(或true
),则指定用户组的成员可以创建该模型的新记录。在你的例子中,它被设置为0
,意味着用户不能在test_model
中创建新的记录。 -
perm_unlink: 删除权限。如果设置为
1
(或true
),则指定用户组的成员可以删除该模型的记录。在你的例子中,它被设置为0
,意味着用户不能删除test_model
的记录。
总之,这条权限规则意味着属于“内置用户”组的用户可以查看 test_model
模型的记录,但不能对其进行修改、创建或删除操作。这种权限设置在实际应用中有助于限制用户对数据的操作,确保数据的完整性和安全性。
实践:给我们之前创建的estate_property模型创建权限
在estate/security/ir.model.access.csv文件里加入以下权限控制:
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_estate_property,access_estate_property,model_estate_property,base.group_user,1,1,1,1
好的,重启容器:docker restart <container_id>
很棒!你已经学会了基础的权限控制。
ir开头,指的是Internal Resources内部资源,这个前缀用于标识核心模块和基础设施的一部分,涵盖了系统级的功能和配置,包括但不限于模型访问权限、数据模型(对象)、UI视图、工作流程、报告和技术特性等。
上一篇文章 odoo17开发教程(4):模块module和model中的字段类型_odoo17 model属性-CSDN博客