跳至内容

Odoo20 权限架构变更:基于 ir.access 配置多公司记录过滤规则

2026年10月23日 由
Odoo20 权限架构变更:基于 ir.access 配置多公司记录过滤规则
中国 Odoo, 苏州远鼎

讲到 Odoo 20,使用记录规则(ir.rule)和访问权限(ir.model.access)实现安全控制的传统方式已经完全改变。在 Odoo 20 中,单一的 ir.access 模型同时处理记录规则与访问权限。

在 Odoo 20 中实现多公司数据安全,需要采用全新方案,使用统一的 ir.access.csv 文件。下面介绍如何在 Odoo 20 中编写多公司记录规则,我们开始吧。

1. 模型配置

想要应用多公司规则,模型必须做好配置以支持公司数据隔离。 设置模型参数 _check_company_auto = True。该配置会在新建和写入记录时触发 _check_company 方法,对标记了 check_company=True 的关联字段校验公司一致性。

定义 company_id 字段,默认值设为 lambda self: self.env.company。这样创建记录时,记录会自动归属到当前公司。

company_id = fields.Many2one(

    comodel_name='res.company',

    string='Company',

    default=lambda self: self.env.company,

)

在所有关联字段(例如指向 res.partner 的多对一字段)上添加 check_company=True。该配置只允许关联同一家公司的数据,否则 Odoo 会抛出报错。可以避免把 A 公司的联系人挂载到 B 公司单据上。

partner_id = fields.Many2one(

    comodel_name='res.partner',

    string='Partner',

    check_company=True,

)

2. 在 ir.access.csv 中配置权限与限制

不再需要编写复杂的 XML ir.rule 记录,Odoo 20 直接在 CSV 文件里同时配置访问权限和记录过滤规则。

在 security/ir.access.csv 新增一行:group 列(group_id/id)留空,domain 列填写过滤域,代表对所有用户生效的全局限制。group 列留空意味着这条规则适用于所有用户组,所有用户查看记录时都会按照 domain 域进行过滤。

如果一行的 group 列填入用户组标识,则代表为该用户组授予访问权限。只要 group 列有值,系统就会将其识别为访问权限,向指定用户组开放数据访问。

如果一行同时填写 group 列与 domain 列,则代表带过滤限制的权限:指定用户组拥有该模型的访问权限,但用户只能看到 domain 筛选后的记录。

options 列用来控制用户允许执行的操作。设置为 crud 代表开放全部增删改查权限;单独授权某一个操作时,依次填写 c(新建)、r(读取)、u(更新)、d(删除)。填写 options 时字母顺序不能打乱。

id

name

model_id

group_id/id

operation

domain

permission

test.model

test.model

test.model

base.group_user

crud

multi-company restriction

multi-company

test.model

test.model

test.model


crud

`['

', ('company_id', '=', False), ('company_id', 'in', company_ids)]`

3. company_ids 变量依靠上下文实现动态取值

限制域中的 company_ids 变量会根据当前用户会话动态求值。用户在 Odoo 左上角托盘勾选切换可用公司时,前端会在上下文中注入 allowed_company_ids。ORM 读取该上下文,自动给 env.companies 赋值为选中的公司。CSV 里的 domain 会拿记录的 company_id 和当前会话环境做比对,实时过滤可见数据。

4. 常见数据泄露风险

一些小小的配置失误,就会打破多公司数据隔离。

  • 变量引号问题:如果在 domain 里把 company_ids 用引号包起来,Odoo 会把它当成字符串而非公司 ID 列表,用户新建单据时直接报权限错误。
  • 错误绑定用户组:给限制规则行指定用户组后,不在该组内的用户会直接绕过这条规则。
  • Sudo 权限:后端 Python 代码使用 .sudo() 会绕过全部 ir.access 限制。

Odoo 20 重构了安全体系,把记录规则和访问权限统一收纳在 ir.access 模型中,只要配置得当,不会破坏数据隔离。配合 _check_company_auto=True、字段 check_company=True,再使用不绑定用户组的全局过滤规则,就可以保障多公司场景下的数据安全。建议在开发初期就落地这套安全机制,避免后续出现安全漏洞。

 

Odoo20 权限架构变更:基于 ir.access 配置多公司记录过滤规则
中国 Odoo, 苏州远鼎 2026年10月23日
标签
存档