Odoo 14社区版如何实现Partner模型的基于记录的访问控制
Odoo 14社区版实现Partner单记录多角色差异化权限实操
核心实现逻辑
Odoo14社区版原生权限体系基于「权限组+记录规则+视图级按钮控制」搭建,无需依赖付费扩展模块,将「Partner与关联用户的角色映射关系」与原生权限规则绑定,即可实现单条Partner记录下不同关联用户的差异化操作权限。
步骤1:搭建基础角色关联数据结构
- 新建自定义中间模型,用来存储Partner记录和内部关联用户的对应角色关系,替代Odoo自动生成的无扩展字段的多对多关联表。模型核心字段定义参考代码:
# Partner关联用户角色映射中间模型 class PartnerUserRole(models.Model): _name = 'partner.user.role' _description = 'Partner关联用户角色映射' partner_id = fields.Many2one( 'res.partner', string='关联Partner记录', required=True, ondelete='cascade' ) user_id = fields.Many2one( 'res.users', string='关联内部用户', required=True, domain=[('share', '=', False)] # 排除外部共享用户 ) role = fields.Selection([ ('driver', '司机'), ('sales', '销售人员'), ('account_manager', '客户经理') ], string='绑定角色', required=True)
- 扩展原生
res.partner模型,新增一对多字段关联上面的中间模型,方便在Partner的表单界面直接配置关联用户和对应角色:
class ResPartner(models.Model): _inherit = 'res.partner' related_user_role_ids = fields.One2many( 'partner.user.role', 'partner_id', string='关联内部用户及角色配置' )
步骤2:配置基础权限组
在Contacts应用的权限层级下新建三个独立权限组,作为权限控制的基础载体:
Partner司机角色组:仅授予组内用户全局查看Partner记录的基础权限,不开放创建、编辑、删除的全局操作权限Partner销售角色组:在司机权限的基础上,追加全局编辑Partner记录的权限,不开放删除权限Partner客户经理角色组:在销售权限的基础上,追加全局删除Partner记录的权限- 视图层适配:在Partner的列表、表单视图上,给「编辑」「删除」按钮添加
groups属性:编辑按钮只对销售、客户经理组可见,删除按钮只对客户经理组可见,从界面层直接屏蔽无权限的操作入口,避免无权限用户误触或尝试越权操作。
步骤3:配置记录规则实现单记录权限匹配
针对每个权限组分别建立独立的记录规则,绑定当前用户的关联角色关系,实现「仅能操作自己被绑定对应角色的Partner记录」的隔离效果:
- 司机组的查看权限规则:域设置为
[('related_user_role_ids.user_id', '=', user.id), ('related_user_role_ids.role', '=', 'driver')],即当前用户在某条Partner的角色映射表中以司机身份关联时,拥有这条记录的查看权限 - 销售组的查看、编辑权限规则:域设置为
[('related_user_role_ids.user_id', '=', user.id), ('related_user_role_ids.role', '=', 'sales')],即当前用户在某条Partner的角色映射表中以销售身份关联时,拥有这条记录的查看、编辑权限 - 客户经理组的查看、编辑、删除权限规则:域设置为
[('related_user_role_ids.user_id', '=', user.id), ('related_user_role_ids.role', '=', 'account_manager')],即当前用户在某条Partner的角色映射表中以客户经理身份关联时,拥有这条记录的全部操作权限
效果匹配验证
以需求里的Top Company这条Partner记录为例:
- 给该记录关联3个用户的角色映射:用户1绑定司机角色、用户2绑定销售角色、用户3绑定客户经理角色
- 用户1访问该记录时,仅可查看内容,编辑、删除按钮置灰不可操作
- 用户2访问该记录时,可查看、编辑内容,删除按钮置灰不可操作
- 用户3访问该记录时,可完成查看、编辑、删除的全部操作
- 未被绑定到该记录角色映射的其他用户,完全无法检索、访问这条Partner记录,不存在越权访问风险
适配提示
- 后续需要新增角色时,仅需在角色选择字段中追加选项,新建对应权限组、补充匹配的记录规则即可,无需重构现有逻辑
- 配置过程中需要注意在所有记录规则中排除共享外部用户的关联关系,避免把外部联系人的关联数据误算入权限判定逻辑,造成权限泄露
内容的提问来源于stack exchange,提问作者Krishnakant
相关产品推荐
相关产品推荐

