如何在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')
关键配置说明
- 路由权限:
auth='public'确保控制器无需Odoo登录即可访问,是实现免密登录的基础。 - CSRF校验:
csrf=False关闭CSRF验证(因第三方SSO服务通常无法传递Odoo的CSRF token),但生产环境需通过IP白名单、请求签名等方式弥补安全漏洞。 - 会话初始化:直接设置
session.uid等核心参数,等效于完成Odoo内置的登录流程,确保用户后续访问拥有对应权限。
生产环境必加安全措施
- 必须在控制器开头添加SSO身份校验逻辑,比如验证请求中的签名、JWT token等,防止恶意请求伪造用户登录。
- 限制控制器访问IP,仅允许SSO服务所在IP调用该接口。
- 多公司场景下,可通过SSO传递的公司参数动态设置
allowed_company_ids。
内容的提问来源于stack exchange,提问作者remcoh
相关产品推荐
相关产品推荐

