如何在Odoo中通过外部API限制用户仅访问指定模型权限?
如何限制API用户仅访问指定模型?
问题场景
我需要限制外部API用户的权限范围,让他们只能访问少数指定模型,无法访问其他所有模型。我执行了以下测试步骤:
- 创建全新的空用户组(用户类型设为API),未添加任何访问权限或记录规则;
- 将目标用户加入该组;
- 将该用户从其他所有组(如"Internal User")中移除。
但测试发现,使用该用户登录并通过API调用模型时仍可正常执行,仿佛已获得全部所需权限。
更新:我使用以下Python代码发起API请求,能正常获取custom_method()的响应结果:
import xmlrpc.client url = "你的Odoo实例地址" db = "数据库名" username = "API用户名" password = "密码" common = xmlrpc.client.ServerProxy('{}/xmlrpc/2/common'.format(url)) uid = common.authenticate(db, username, password, {}) if uid: print("authentication succeeded") models = xmlrpc.client.ServerProxy('{}/xmlrpc/2/object'.format(url)) api_result = models.execute(db, uid, password, 'custom.object', 'custom_method', {'custom_info': {'test_key': 'test_value'}})
解决方案
针对这个问题,需要从权限机制的几个关键点入手排查和配置:
确认用户类型为「仅API」
确保目标用户的「用户类型」设置为仅API(在用户表单的「访问权限」标签页),避免继承内部用户的默认权限。为用户组添加明确的指定模型权限
不要依赖空组的默认限制,主动配置权限:- 进入「设置」→「用户与公司」→「组」,找到目标API用户组;
- 在「访问权限」标签下,仅勾选需要开放的模型及对应权限(如读/写/创建/删除,按需选择);
- 确保该组未继承任何其他有权限的组,且其他模型的权限均未被勾选。
检查自定义方法的权限校验逻辑
如果调用的是自定义模型的方法,需确保方法内部包含权限检查:
标准模型方法会自动触发权限校验,但自定义方法(尤其是使用@api.model装饰的方法)可能需要手动添加校验,示例:from odoo import api, models class CustomObject(models.Model): _name = 'custom.object' @api.model def custom_method(self, custom_info): # 检查当前用户是否拥有该模型的读权限 self.check_access_rights('read') # 若需限制记录范围,添加记录规则检查 self.check_access_rule('read') # 后续业务逻辑代码 return {"result": "success"}配置记录规则(可选)
如果需要进一步限制用户能访问的具体记录,可针对指定模型添加记录规则,并关联到目标API用户组,确保用户只能操作符合条件的记录。清除权限缓存后重新测试
权限缓存可能导致修改不立即生效,测试前可重启服务,或在「设置」中点击「清除缓存」。
内容的提问来源于stack exchange,提问作者Zarathustra
相关产品推荐
相关产品推荐

