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

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

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

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

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

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

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

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

@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):raiseexcept 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 往后继续操作

@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 模型进行操作, 下面是例子

from odoo import models
from odoo.http import requestclass IrHttp(models.AbstractModel):_inherit = 'ir.http'@classmethoddef _auth_method_wechat(cls):user = request.env.ref('xxx.user_wxapp_user_manager')  # 给后端用户作为认证request.uid = user.idrequest.user = user

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

main.py 文件

普通接口访问如下

@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' 即可

@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')

最后是模块的目录结构

└─demo│  __init__.py│  __manifest__.py│├─controllers│      main.py│      __init__.py│├─models│      ir_http.py│      __init__.py

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

http://www.lryc.cn/news/484428.html

相关文章:

  • 租赁回收系统小程序
  • SQL 注入详解:原理、危害与防范措施
  • 如何用Java爬虫“采集”商品订单详情的编程旅程
  • 《FreeRTOS任务基础知识篇》
  • 前端面试笔试(二)
  • 基于Python 和 pyecharts 制作招聘数据可视化分析大屏
  • 探索光耦:晶体管光耦——智能家居的隐形桥梁,让未来生活更智能
  • 三、模板与配置(上)
  • 基于SpringBoot和Vue的公司文档管理系统设计与开发(源码+定制+开发)
  • Java21 Switch最全使用说明
  • 普通电脑上安装属于自己的Llama 3 大模型和对话客户端
  • 微信小程序原生 canvas画布截取视频帧保存为图片并进行裁剪
  • 社交网络图中结点的“重要性”计算
  • 前端(1)——快速入门HTML
  • gitlab角色、权限
  • Python办公——批量eml文件提取附件
  • Spring Boot 中 Druid 连接池与多数据源切换的方法
  • JavaScrip中私有方法的创建
  • .Net Core根据文件名称自动注入服务
  • APT 参与者将恶意软件嵌入 macOS Flutter 应用程序中
  • 第 3 章 -GO语言 基本语法
  • 【qt】控件
  • 入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法:科技守护安全的新篇章
  • 【AiPPT-注册/登录安全分析报告-无验证方式导致安全隐患】
  • 【设计模式】行为型模式(二):策略模式、命令模式
  • STM32中断系统
  • window的Anaconda Powershell Prompt 里使用linux 命令
  • Lisp 语言入门教程(一)
  • Git - Think in Git
  • jmeter常用配置元件介绍总结之用linux服务器压测