「TIL」在 Odoo 中自定义 Controller 认证类型

在 ERP 系统中,确保数据安全性和访问控制是一件至关重要事情,今天学会了如何在 Odoo 中自定义 Controller 认证类型,以满足特定的业务需求。

认证方式概览

Odoo 的 Controller 默认提供三种认证方式:none, public, user。这些方式分别适用于不同的场景:
  • none:无需认证,适用于完全公开的数据访问。
  • public:公共用户认证,适用于有限的数据访问。
  • user:普通用户认证,需要正确的用户凭据。
在实际应用中,有时候我们需要更灵活的认证方式。例如,当和第三方系统进行对接时,通常会通过 Token 进行用户认证,但官方并没有提供使用 API Key 进行认证的方式。

自定义认证方法的实现

幸运的是,得益于 Odoo 的高度抽象,我们可以通过以下步骤轻松添加自定义的认证方法:
  1. 继承并扩展模型 ir.http: 通过继承 ir.http 模型,我们可以添加自定义的认证方法。例如,创建一个新的认证类型 token
    1. @classmethod def _auth_method_token(cls): ...
  1. 定义路由并指定认证类型: 在定义路由时,使用 auth='token' 指定我们的自定义认证方法:
    1. @http.route('/api/v1/test', type='json', auth='token', method=['POST'], csrf=False) def test(self, **kw): ...

实际案例分析:Outlook 插件认证

mail_client_extension 模块中,有一个实现自定义认证方法的例子,它用于 Outlook 插件的认证。这个例子展示了如何使用 HTTP 头中的访问令牌进行认证:
# file: /addons/mail_client_extension/models/ir_http.py (Odoo 14) @classmethod def _auth_method_outlook(cls): access_token = request.httprequest.headers.get('Authorization') if not access_token: raise BadRequest('Access token missing') if access_token.startswith('Bearer '): access_token = access_token[7:] user_id = request.env["res.users.apikeys"]._check_credentials(scope='odoo.plugin.outlook', key=access_token) if not user_id: raise BadRequest('Access token invalid') request.uid = user_id
这个例子说明了如何从 HTTP 请求头中提取访问令牌,并使用它来验证用户。这种方法为在 Odoo 中实现更复杂的认证逻辑提供了一个很好的范例。

结论

通过自定义 Controller 认证类型,我们可以为 Odoo 系统提供更灵活和安全的数据访问控制。这种方法尤其适用于需要与外部系统集成或提供不同认证机制的情况。通过简单的继承和方法扩展,Odoo 为开发者提供了强大的工具来满足复杂的业务需求。

©️
 本文采用 CC BY-NC-ND 4.0 许可协议。转载或引用时请遵守协议内容!

© Ruter Lü 2016 - 2024