使用Odoo 14外部API操作非活跃用户时出现Access Denied错误
Odoo 14 非活跃用户外部API访问受限问题说明
这是Odoo 14版本正式引入的默认安全机制改动,并非你遗漏了相关配置项。
不同版本的逻辑差异
Odoo 13及更早版本的外部API身份校验仅验证账号凭证、权限组两个维度,不会检查用户的active字段状态,只要凭证正确、权限匹配就能正常调用接口。
从Odoo 14开始,res.users模型的身份校验逻辑新增了active字段的前置校验:
- 所有外部API请求的身份验证环节,会首先判断请求对应用户的
active属性是否为True - 只要
active为False,无论其他权限配置是否正确,都会直接返回Access Denied错误,拦截后续所有操作
适配方案
如果业务场景确实需要允许非活跃用户调用API,可以通过自定义模块修改校验逻辑,操作如下:
- 新建自定义Odoo模块,依赖
base核心模块 - 继承
res.users模型,重写_check_credentials方法,移除对active字段的校验限制
参考代码:
from odoo import models, api from odoo.exceptions import AccessDenied class ResUsers(models.Model): _inherit = 'res.users' @api.model def _check_credentials(self, password, user_agent_env): # 绕过active限制查询对应用户 target_user = self.sudo().search([('id', '=', self.env.uid)], limit=1, active_test=False) if not target_user: raise AccessDenied() # 调用原生校验逻辑时关闭active检测 return super(ResUsers, target_user.with_context(active_test=False))._check_credentials(password, user_agent_env)
提示:修改默认安全规则存在权限泄露风险,非必要场景不建议调整,优先将需要调用API的账号设置为活跃状态即可。
内容的提问来源于stack exchange,提问作者Ahmad Sabeh
相关产品推荐
相关产品推荐

