mcpField
O
odoo-security-rules

odoo-security-rules

github.com/sickn33安全48.7k50 次安装今天更新
代码仓库

关于 odoo-security-rules

用于配置和排查 Odoo 模型访问权限及记录级规则的技能,提供 ACL CSV 条目与 XML 域规则指导,并关注多公司可见性、群组范围和普通用户测试。

主要功能

  1. 01生成 ir.model.access.csv 条目
  2. 02创建基于域的 ir.rule 规则
  3. 03诊断访问拒绝错误
  4. 04配置多公司可见性
  5. 05群组与规则测试指导

适用场景

  1. 01为自定义模块设置访问权限
  2. 02限制记录仅对创建者或所属公司可见
  3. 03排查 Odoo 访问错误
  4. 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 记录规则。

何时使用此技能

  • 为新的自定义模块设置访问权限。
  • 限制记录的可见范围,让用户只能查看自己的数据或所属公司的数据。
  • 排查“访问被拒绝”或“你无权访问”错误。
  • 实现多公司记录可见性规则。

工作原理

  1. 激活:提及 @odoo-security-rules 并描述访问场景。
  2. 生成:获取正确的 CSV 访问权限行和 XML 记录规则。
  3. 排查:粘贴访问错误并获取诊断和修复方案。

示例

示例 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