odoo 17 后端路由接口认证自定义

odoo 17 后端路由接口认证自定义

在接口中, 我们都知道有3中常用的认证方式

  • user 用户级认证
  • public 访问时赋予公共用户
  • none 不做任何用户级处理 一般不做数据库重要数据校验, 仅做访问处理

以上是源码提供的三种方式

接下来我们自定义一个认证方式

首先找到的这认证是在 ir.http 模型内完成的, 认真源码如下

python 复制代码
@classmethod
def _authenticate(cls, endpoint):
    auth = 'none' if http.is_cors_preflight(request, endpoint) else endpoint.routing['auth']
    try:
        if request.session.uid is not None:
            if not security.check_session(request.session, request.env):
                request.session.logout(keep_db=True)
                request.env = api.Environment(request.env.cr, None, request.session.context)
        getattr(cls, f'_auth_method_{auth}')()
    except (AccessDenied, http.SessionExpiredException, werkzeug.exceptions.HTTPException):
        raise
    except Exception:
        _logger.info("Exception during request Authentication.", exc_info=True)
        raise AccessDenied()

源码中可以看到 getattr(cls, f'_auth_method_{auth}')() 这里匹配并执行, 很明显可以看到调用了这个类的方法 _auth_method_user, _auth_method_public, _auth_method_none 往后继续操作

python 复制代码
@classmethod
def _get_public_users(cls):
    return [request.env['ir.model.data']._xmlid_to_res_model_res_id('base.public_user')[1]]

@classmethod
def _auth_method_user(cls):
    if request.env.uid in [None] + cls._get_public_users():
        raise http.SessionExpiredException("Session expired")

@classmethod
def _auth_method_none(cls):
    request.env = api.Environment(request.env.cr, None, request.env.context)

这时候我们只需继承 ir.http 模型进行操作, 下面是例子

python 复制代码
from odoo import models
from odoo.http import request


class IrHttp(models.AbstractModel):
    _inherit = 'ir.http'

    @classmethod
    def _auth_method_wechat(cls):
        user = request.env.ref('xxx.user_wxapp_user_manager')  # 给后端用户作为认证
        request.uid = user.id
        request.user = user

这里以通过添加微信认证wechat为例, 将模块安装后,系统会增加一个微信认证功能, 更多操作请在方法中编写逻辑

main.py 文件

普通接口访问如下

python 复制代码
@http.route('/demo/auth/reload', type='http', auth='user', methods=['GET'], cors='*', csrf=False)
def auth_reload(self):
    """
    认证接口, 需要通过用户级认证
    """
    return Response(json.dumps({}), status=200, content_type='application/json')

自定义认证访问, 只需修改 auth='wechat' 即可

python 复制代码
@http.route('/demo/auth/reload', type='http', auth='wechat', methods=['GET'], cors='*', csrf=False)
def auth_reload(self):
    """
    自定义认证接口, 通过 _auth_method_wechat 方法处理用户需求
    """
    return Response(json.dumps({}), status=200, content_type='application/json')

最后是模块的目录结构

js 复制代码
└─demo
    │  __init__.py
    │  __manifest__.py
    │
    ├─controllers
    │      main.py
    │      __init__.py
    │
    ├─models
    │      ir_http.py
    │      __init__.py

注意, 别忘了将 controllers 和 models 导出到包外

相关推荐
Mr.E51 天前
odoo18 关闭搜索框点击自动弹出下拉框
开发语言·前端·javascript·odoo·owl·odoo18
odoo中国8 天前
Odoo 19 技术教程:如何在 Odoo 19 中使用模型属性
odoo·odoo开发·odoo19·模型属性
odoo中国9 天前
Odoo 19 制造模块功能:制造模块中废品管理操作指南
制造·odoo·odoo19·生产废品管理·生产报废管理·报废流程
odoo中国10 天前
Odoo 19 中升级(迁移)脚本的使用方法
odoo·odoo19·odoo技术·升级脚本·迁移脚本
odoo中国11 天前
Odoo 19 安全完整解析:多层防护守护企业核心数据
安全·odoo·数据备份·数据保护·用户权限·odoo19·用户访问规则
odoo中国13 天前
Odoo 19 功能性报表解析:如何高效使用补货报表
odoo·odoo19·库存报表·补货报表
odoo中国13 天前
如何在 Odoo 19 中创建序列
odoo·odoo19·自定义单据序列
odoo中国22 天前
Odoo 19 财务功能概述:财务模块中的定期存货计价(期末库存结转)
odoo·库存管理·财务管理·odoo19·库存计价·库存估值·期末库存结转
odoo中国24 天前
Odoo 19 库存功能实操:产品包装的设置与管理
odoo·仓库管理·odoo19·包装设置与管理
云草桑24 天前
Odoo 19.0 Docker Desktop快速部署 和Ubuntu24上安装1panel面板
运维·docker·容器·odoo