Odoo 17多公司记录访问控制配置问题及解决方案问询
Odoo 17社区版多公司权限配置解决方案
一、Record Rules和ACLs分步配置指南
1. 基础ACL配置
- 确保用户所属业务组已分配对应模型的操作权限(如销售组需拥有
sale.order的读/写/创建/删除权限),ACL仅控制模型级权限,记录级隔离需依赖Record Rules。 - 禁止给普通业务用户分配
Manage multi-company或Superuser特权组,此类权限会绕过多公司隔离规则。
2. 全局Record Rules统一配置
不要仅针对sale.order设置规则,需给所有需隔离的业务模型(如product.product、res.partner、account.move)添加多公司规则:
- 规则条件:
['|', ('company_id', '=', False), ('company_id', '=', user.company_id.id)]
解释:允许访问无公司归属的公共记录,或当前用户所属公司的记录 - 规则应用范围:选择
Global对所有组生效,或针对特定业务组(如销售组、采购组)单独设置 - 特殊模型适配:对于
res.users,规则需调整为['|', ('company_id', '=', user.company_id.id), ('id', '=', user.id)],确保用户仅能查看自身及同公司用户
3. 关联字段权限修正
针对下拉菜单显示其他公司数据的问题,核心是给关联目标模型添加对应Record Rules:
- 以产品下拉为例,给
product.product添加全局多公司规则(条件同上),Odoo会自动在关联字段的搜索/下拉查询中应用目标模型的规则 - 自定义模块的关联字段,避免设置
context={'active_test': False}等绕过规则的参数,默认配置下Odoo会自动启用记录规则过滤
二、特定上下文的Record Rules调试方法
1. 开发者模式可视化调试
- 开启开发者模式,进入目标模型的记录规则列表(如
sale.order的规则页面) - 点击规则的
测试按钮,输入待测试用户ID,系统会返回该用户可访问的记录范围及规则匹配结果 - 在模型的
访问权限页面,可查看所有生效的ACL和Record Rules列表
2. 日志调试
- 在Odoo配置文件中添加权限相关日志配置:
log_level = debug log_handler = werkzeug:WARNING,odoo.addons.base.models.ir_rule:DEBUG - 重启Odoo后执行对应操作(如打开销售订单产品下拉),日志会输出当前应用的规则、过滤条件及结果,快速定位未生效的规则
三、Odoo原生多公司控制最佳实践
启用原生多公司机制:
- 在「设置 -> 通用设置」中开启
多公司选项 - 给用户分配唯一所属公司,不勾选「允许访问所有公司」
- 在「设置 -> 通用设置」中开启
统一规则模板:
- 对所有业务模型复用相同的多公司规则条件,避免遗漏
- 公共数据(如国家、货币)设置
company_id为False,允许全用户访问
严格权限管控:
- 仅给超级管理员或跨公司管理人员分配
Manage multi-company权限 - 普通业务用户禁止分配
Superuser权限
- 仅给超级管理员或跨公司管理人员分配
全面测试覆盖:
- 创建不同公司的测试用户,验证以下场景:
- 能否正常查看/编辑同公司记录
- 尝试访问其他公司记录是否被拒绝
- 关联字段下拉是否仅显示同公司数据
- 报表是否仅包含同公司业务数据
- 创建不同公司的测试用户,验证以下场景:
四、常见问题处理技巧
- 关联字段绕过规则:检查目标模型的Record Rules是否配置正确,自定义字段的
domain需追加公司条件,如[('active', '=', True), ('company_id', '=', user.company_id.id)] - 报表跨公司显示:检查报表数据源模型的规则,或在报表动作设置中添加默认域
[('company_id', '=', user.company_id.id)] - 规则不生效:确认规则的
应用于组包含用户所属组,避免被更高优先级的规则覆盖(全局规则优先级高于组规则)
内容的提问来源于stack exchange,提问作者CodersFort
相关产品推荐
相关产品推荐

