You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Odoo自定义控制器中实现免用户名密码登录?

Odoo免密码登录控制器实现(SSO会话创建)

核心实现思路

通过自定义公开访问的控制器,在完成SSO身份校验后(需自行补充),手动初始化Odoo会话,跳过用户名密码验证流程。以下是可直接复用的代码示例及关键注意事项:

完整控制器代码

from odoo import http
from odoo.http import request

class SSOLoginController(http.Controller):

    @http.route('/sso/login', type='http', auth='public', website=False, csrf=False)
    def sso_login(self, email=None, **kwargs):
        # ********** 关键:此处必须添加SSO身份验证逻辑 **********
        # 示例仅做演示,生产环境需校验请求签名、token等,确保请求来自可信SSO服务
        if not email:
            return "错误:缺少用户标识参数"
        
        # 以邮箱匹配用户,public权限下需用sudo获取用户数据
        user = request.env['res.users'].sudo().search([('email', '=', email)], limit=1)
        if not user:
            return "错误:未找到对应用户"
        
        # 手动初始化Odoo会话
        request.session.uid = user.id
        request.session.login = user.login
        request.session.company_id = user.company_id.id
        # 配置用户上下文,保证语言、时区、公司权限正确
        request.session.context = {
            'lang': user.lang,
            'tz': user.tz,
            'allowed_company_ids': [user.company_id.id]
        }
        
        # 重定向至Odoo后台首页,可根据需求修改目标路径
        return request.redirect('/web')

关键配置说明

  1. 路由权限:auth='public'确保控制器无需Odoo登录即可访问,是实现免密登录的基础。
  2. CSRF校验:csrf=False关闭CSRF验证(因第三方SSO服务通常无法传递Odoo的CSRF token),但生产环境需通过IP白名单、请求签名等方式弥补安全漏洞。
  3. 会话初始化:直接设置session.uid等核心参数,等效于完成Odoo内置的登录流程,确保用户后续访问拥有对应权限。

生产环境必加安全措施

  • 必须在控制器开头添加SSO身份校验逻辑,比如验证请求中的签名、JWT token等,防止恶意请求伪造用户登录。
  • 限制控制器访问IP,仅允许SSO服务所在IP调用该接口。
  • 多公司场景下,可通过SSO传递的公司参数动态设置allowed_company_ids。

内容的提问来源于stack exchange,提问作者remcoh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:27:22