当前位置: 首页 > article >正文

Odoo17 4模型安全访问控制:深入理解 model_id:id 和 group_id:id

核心概念:外部标识符(External ID)

在 Odoo 中,model_id:idgroup_id:id 字段的值,如 my_hostel.model_hostel_hostelmy_hostel.group_hostel_manager,并不是直接的数据库 ID,而是外部标识符

  • 外部标识符(External ID)是什么?

    • 它是一个字符串,格式为 <module_name>.<unique_name>,例如 my_hostel.model_hostel_hostel
    • 它在整个 Odoo 系统中唯一地标识一个数据库记录。
    • 它通常用于在 XML 文件中引用数据库记录,例如在定义访问控制规则时。
  • 为什么使用外部标识符?

    • 避免硬编码 ID: 使用数据库 ID 最大的问题是,这些 ID 在不同的 Odoo 实例中可能不同。如果直接使用 ID,会导致代码无法跨实例移植。外部标识符则保证了跨实例的唯一性。
    • 更易读: 外部标识符使用有意义的名称,而不是难以理解的数字 ID,提高代码可读性。
    • 方便模块化: 使用外部标识符,模块之间的关联更加清晰,可以轻松地引用其他模块中的数据。

详细解释 model_id:idgroup_id:id

  1. model_id:id

    • 作用: 此字段用于指定 访问规则 应用于哪个 模型 (数据库表)。
    • : 是一个外部标识符,例如 my_hostel.model_hostel_hostel
      • my_hostel: 模块名称。
      • model_hostel_hostel: 在 my_hostel 模块中,定义 hostel.hostel 模型时的内部名称 (External ID)。注意,这里不是直接的模型名称 hostel.hostel,而是一个在 ir.model 中表示 hostel.hostel 的记录的名称 (通常以 model_ 开头)。
    • 解析过程:
      1. Odoo 根据点号 (.) 分割外部标识符:my_hostel (模块名) 和 model_hostel_hostel(模型记录名)。
      2. Odoo 在 ir.model 表中查找 module 字段 等于 my_hostel 并且 name 字段 等于 hostel.hostel (注意:这里是真实的模型名称) 的记录 (实际上,Odoo 内部会根据模块和模型名称生成一个 ir.model 记录)。
      3. 如果找到匹配的记录,Odoo 将获取该记录的 id 字段 的值,并将其作为 model_id:id 的值,记录到访问控制规则中。
  2. group_id:id

    • 作用: 此字段用于指定 访问规则 应用于哪个 用户组
    • : 是一个外部标识符,例如 my_hostel.group_hostel_managermy_hostel.group_hostel_user
      • my_hostel: 模块名称。
      • group_hostel_managergroup_hostel_user: 在 my_hostel 模块中定义的用户组的内部名称 (External ID)。
    • 解析过程:
      1. Odoo 根据点号 (.) 分割外部标识符:my_hostel (模块名) 和 group_hostel_managergroup_hostel_user(用户组记录名)。
      2. Odoo 在 res.groups 表中查找 module 字段 等于 my_hostel 并且 name 字段 等于 hostel.manager (注意: 这里是用户组名称) 的记录 (实际上,Odoo 内部会根据模块和用户组名称生成一个 res.groups 记录)。
      3. 如果找到匹配的记录,Odoo 将获取该记录的 id 字段 的值,并将其作为 group_id:id 的值,记录到访问控制规则中。

举例说明

假设在你的 my_hostel 模块中,你定义了 hostel.hostel 模型,并且定义了 hostel.managerhostel.user 这两个用户组。

  1. ir.model 表中的记录:

    Odoo 在你安装 my_hostel 模块时会自动在 ir.model 表中创建一条记录,表示 hostel.hostel 模型:

    idmodulemodelname
    10my_hostelhostel.hostelmodel_hostel_hostel

    假设这条记录的 id 是 10 。那么当 Odoo 解析 my_hostel.model_hostel_hostel 时,就会取 id=10

  2. res.groups 表中的记录:

    Odoo 在你安装 my_hostel 模块时会自动在 res.groups 表中创建两条记录,表示 hostel.managerhostel.user 这两个用户组:

    idmodulename
    15my_hostelhostel.manager
    16my_hostelhostel.user

假设这两条记录的 id 分别为 15 和 16。 那么当 Odoo 解析 my_hostel.group_hostel_manager 时,就会取 id=15; 解析 my_hostel.group_hostel_user 时,就会取 id=16

  1. 访问规则:

    在你的 ir.model.access.csv 文件中,你可以有这样的规则:

    id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
    access_hostel_manager,hostel.manager.access,my_hostel.model_hostel_hostel,my_hostel.group_hostel_manager,1,1,1,1
    access_hostel_user,hostel.user.access,my_hostel.model_hostel_hostel,my_hostel.group_hostel_user,1,0,0,0
    
    • access_hostel_manager: 表示 hostel.manager 用户组对 hostel.hostel 模型有读、写、创建和删除的权限。
    • access_hostel_user: 表示 hostel.user 用户组对 hostel.hostel 模型只有读的权限。

    在数据库中, Odoo 会将规则记录为:

    idmodel_idgroup_idperm_readperm_writeperm_createperm_unlink
    10151111
    10161000

总结

  • model_id:idgroup_id:id 使用外部标识符,而不是数据库 ID,以便跨 Odoo 实例保持一致性。
  • Odoo 会根据这些外部标识符在 ir.modelres.groups 表中查找对应的记录,并获取其 id 值,从而实现对模型和用户组的引用。
  • 这种方式使得访问控制规则更加灵活和可维护。

http://www.kler.cn/a/459079.html

相关文章:

  • 大白话拆解——多线程中关于死锁的一切(七)(已完结)
  • Django 中数据库迁移命令
  • 【HAProxy】如何在Ubuntu下配置HAProxy服务器
  • DC-2 靶场渗透
  • 大模型系列17-RAGFlow搭建本地知识库
  • 逻辑推理算法
  • LabVIEW 中 NI Vision 模块的IMAQ Create VI
  • [Excel] CONCATENATE TEXT
  • 实际部署Dify可能遇到的问题:忘记密码、开启HTTPS、知识库文档上传的大小限制和数量限制
  • 【Golang 面试题】每日 3 题(十一)
  • 爬虫基础之爬取 某漫画网站
  • 前端Python应用指南(七)使用SQLAlchemy与Django ORM:数据库操作的Python实践
  • 大数据-264 实时数仓 - Canal MySQL的binlog研究 存储目录 变动信息 配置MySQL
  • 论文笔记PhotoReg: Photometrically Registering 3D Gaussian Splatting Models
  • 【Unity功能集】TextureShop纹理工坊(七)魔棒工具
  • 深入浅出:从入门到精通大模型Prompt、SFT、RAG、Infer、Deploy、Agent
  • JavaFX与Gradle版本兼容指南
  • leecode213.打家劫舍||
  • Android 源码阅读随笔(一)—— 下载源码
  • git自动压缩提交的脚本
  • python制作打字小游戏
  • 图文检索(37):局部对齐Stacked Cross Attention for Image-Text Matching
  • GPU 进阶笔记(二):华为昇腾 910B GPU
  • 【从0到0.5】基于STM32F427+DP83848+FreeRTOS+LWIP+CubeMx+Keil搭建TCP服务端与客户端
  • 基于JDK 17 编写的Java常用工具类
  • Docker+Portainer 离线安装