第 4 章:安全性 - 简要介绍

在 上一章 中,我们创建了第一个用于存储业务数据的表。在 Odoo 这样的业务应用中,首先要考虑的问题之一是谁1 可以访问这些数据。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 是 外部标识符。它可用于引用记录(无需知道其在数据库中的标识符)。

  • country_id:id 通过 外部标识符 来引用国家。

  • name 是州的名称。

  • code 是州的代码。

这三个字段在 res.country.state 模型中 定义。

按照约定,导入数据的文件位于模块的 data 文件夹中。当数据与安全相关时,它位于 security 文件夹中。当数据与视图和动作相关时(我们稍后会介绍),它位于 views 文件夹中。此外,所有这些文件都必须在 __manifest__.py 文件的 data 列表中声明。我们的示例文件 在 base 模块的清单文件中 定义。

另请注意,数据文件的内容仅在模块安装或更新时才会被加载。

警告

数据文件按照它们在 __manifest__.py 文件中的顺序依次加载。这意味着如果数据 A 引用数据 B,你必须确保 B 在 A 之前加载。

就国家州/省而言,你会注意到 国家列表 是在 国家州/省列表 之前 加载的。这是因为州/省引用了国家。

为什么这一切对安全性很重要?因为模型的所有安全配置都是通过数据文件加载的,我们将在下一节看到。

访问权限

参考:本主题相关的文档可在 访问权限 中找到。

当模型上没有定义访问权限时,Odoo 会判定没有任何用户可以访问这些数据。

访问权限定义为模型 ir.access 的记录。每条访问权限关联到一个模型、一个用户组(用于限制时可以为空)、一组操作(创建、读取、更新和删除的子集2)以及一个可选的域。此类访问权限通常定义在名为 ir.access.csv 的 CSV 文件中。

以下是我们之前的 test_model 的示例:

id,name,model_id,group_id/id,operation,domain
access_test_model,access_test_model,test_model,base.group_user,crud,
  • id 是 外部标识符。

  • name 是 ir.access 的描述。

  • model_id 指向该访问权限所适用的模型。引用模型的标准方式是使用模型的 _name。

  • group_id/id 指向该访问权限所适用的用户组。

  • operation:指定该访问权限指的是模型上的哪些操作(创建、读取、更新、删除)。例如,字符串 ru 指的是集合 {read, update}。

  • domain:允许或限制对满足该域的记录的访问。如果指定了用户组,则该记录向该用户组的用户提供权限。否则,该记录对所有用户限制满足该域的访问。

练习

添加访问权限。

在适当的文件夹中创建 ir.access.csv 文件,并在 __manifest__.py 文件中定义它。

为 base.group_user 用户组授予创建、读取、更新和删除权限。

现在是时候 与用户界面交互 了!

1

即指哪个 Odoo 用户(或用户组)

2

‘update’ 和 ‘delete’ 操作分别对应 ORM 方法 write() 和 unlink()。