跳至内容

老赵解读Odoo 18开发教程04:安全机制入门

2026年8月15日
老赵解读Odoo 18开发教程04:安全机制入门

原文:Odoo 18 官方开发教程“Server framework 101”第 4 章。本文尽量保留原文结构、代码、练习与图片,仅进行中文翻译,并在文末增加“老赵解读”。

第 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 文件夹中。
此外,所有这些文件都必须在 data 中声明
__manifest__.py 文件中的列表。我们的示例文件已定义
在基本模块的模块清单中

另请注意,数据文件的内容仅在安装模块或
已更新。

警告

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

就国家/地区而言,您会注意到
国家名单
已加载 之前
国家列表
这是因为州指的是国家。

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

访问权

参考:与该主题相关的文档可以在以下位置找到
访问权

说明

目标:在本节末尾,不应再出现以下警告:

text 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外部标识符
  • nameir.model.access 的名称。
  • model_id/id 指访问权限适用的模型。标准参考方式
    模型的 model_<model_name>,其中 <model_name> 是模型的 _name
    . 替换为 _。看起来很麻烦?确实是……
  • group_id/id 指访问权限适用的组。
  • perm_read,perm_write,perm_create,perm_unlink:读、写、创建和取消链接权限

练习

添加访问权限。

在适当的文件夹中创建 ir.model.access.csv 文件并在
__manifest__.py 文件。

向组 base.group_user 授予读取、写入、创建和取消链接权限。

提示:日志中的警告消息为您提供了大部分解决方案;-)

重新启动服务器,警告消息应该就消失了!

现在终于到了 与用户界面交互 的时候了!

1
表示哪个 Odoo 用户(或用户组)
2
“取消链接”相当于“删除”

老赵解读

访问权限不是项目末尾再补的一张表,而是每个模型设计的一部分。ACL 控制某类用户能否读、写、创建和删除模型记录,记录规则则进一步控制“能操作哪些记录”,二者承担的职责不同。

教程为了推进案例使用了较宽松的权限配置,真实项目不能照搬。至少应按角色划分权限,并用非管理员账号逐项验证菜单、读取和写入行为,避免出现“管理员测试正常、普通用户无法使用”或数据越权。

老赵解读Odoo 18开发教程03:模型与基础字段