关于 odoo-security-rules
用于配置和排查 Odoo 模型访问权限及记录级规则的技能,提供 ACL CSV 条目与 XML 域规则指导,并关注多公司可见性、群组范围和普通用户测试。
主要功能
- 01生成 ir.model.access.csv 条目
- 02创建基于域的 ir.rule 规则
- 03诊断访问拒绝错误
- 04配置多公司可见性
- 05群组与规则测试指导
适用场景
- 01为自定义模块设置访问权限
- 02限制记录仅对创建者或所属公司可见
- 03排查 Odoo 访问错误
- 04在不同公司环境中测试权限
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill odoo-security-rules安装后在 Claude Code 中输入/odoo-security-rules确认已加载。
详细介绍
Odoo 安全规则
概述
Odoo 的安全性分为两个层级:模型级访问权限(谁可以读写哪些模型)和记录级规则(用户可以查看哪些记录)。此技能可帮助你编写正确的 ir.model.access.csv 条目和基于域的 ir.rule 记录规则。
何时使用此技能
- 为新的自定义模块设置访问权限。
- 限制记录的可见范围,让用户只能查看自己的数据或所属公司的数据。
- 排查“访问被拒绝”或“你无权访问”错误。
- 实现多公司记录可见性规则。
工作原理
- 激活:提及
@odoo-security-rules并描述访问场景。 - 生成:获取正确的 CSV 访问权限行和 XML 记录规则。
- 排查:粘贴访问错误并获取诊断和修复方案。
示例
示例 1:ir.model.access.csv
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_hospital_patient_user,hospital.patient.user,model_hospital_patient,base.group_user,1,0,0,0
access_hospital_patient_manager,hospital.patient.manager,model_hospital_patient,hospital_management.group_hospital_manager,1,1,1,1
**注意:**加载 CSV 前,先定义专用的模块管理员组(将
hospital_management替换为模块 ID)。患者数据相关角色不要复用权限宽泛的设置/管理组。此组示例适用于 Odoo 18;请核实已安装版本中的组字段:<record id="group_hospital_manager" model="res.groups"> <field name="name">医院管理员</field> <field name="category_id" ref="base.module_category_hidden"/> </record>
示例 2:记录规则——用户只能查看自己的记录
<record id="rule_hospital_patient_own" model="ir.rule">
<field name="name">Hospital Patient: Own Records Only</field>
<field name="model_id" ref="model_hospital_patient"/>
<field name="domain_force">[('create_uid', '=', user.id)]</field>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_unlink" eval="False"/>
</record>
**重要:**不指定组时,规则将成为全局规则(超级用户模式会绕过记录规则)。全局规则取交集;组规则在这些约束范围内取并集。
perm_unlink=False表示删除操作不会检查此规则,而非禁止删除。ACL 会以累加方式授予操作权限;没有适用规则时,记录规则默认允许访问。
示例 3:多公司记录规则
<record id="rule_hospital_patient_company" model="ir.rule">
<field name="name">Hospital Patient: Multi-Company</field>
<field name="model_id" ref="model_hospital_patient"/>
<field name="domain_force">
['|', ('company_id', '=', False),
('company_id', 'in', company_ids)]
</field>
</record>
最佳实践
- ✅ **应该:**从限制最严格的访问权限开始,再按需放宽。
- ✅ **应该:**在多公司规则中使用
company_ids(复数)——它反映当前环境中启用的公司;请测试公司切换。 - ✅ **应该:**在调试模式下使用非管理员用户测试规则——
sudo()会完全绕过所有记录规则。 - ✅ **应该:**为每个模块创建专用安全组,而不是复用 Odoo 核心组。
- ❌ **不要:**除非业务流程明确要求删除,否则不要向普通用户授予
perm_unlink = 1。 - ❌ **不要:**除非有意授予公开(未认证)访问权限,否则不要将
ir.model.access.csv中的group_id留空。 - ❌ **不要:**将
base.group_system用于模块管理员——这会授予完整的技术访问权限,包括服务器配置权限。
验证与来源
请以权限组有重叠的普通用户进行测试:自己的/他人的记录、每种 CRUD 操作、切换当前公司,以及门户/公开用户角色。公司规则假设存在 company_id 字段;允许 False 会有意共享未归属任何公司的记录。请参阅 Odoo 安全性和多公司规则。
限制
- 可通过 ORM 字段的
groups属性限制字段访问;仅在 OWL/视图中隐藏字段并非服务器端访问控制。 - 门户和公开用户的访问规则还有此处未完整涵盖的细节;请使用
base.group_portal仔细测试。 sudo()会绕过记录规则——任何以超级用户上下文运行的代码都会忽略所有ir.rule条目。- 不涵盖通过 PostgreSQL 实现的行级安全(RLS)——Odoo 在 ORM 层管理所有安全性。
评论
支持 Markdown