跳转到主要内容

存储账户和凭证

项目描述

License: AGPL-3

密钥链账户

本模块允许您存储外部系统的凭证。

  • 所有凭证都存储在一个地方:更容易管理和审计。

  • 轻松实现多账户。

  • 为每个账户存储附加数据。

  • 附加数据的验证规则。

  • 为不同的环境(生产/测试/环境/等)使用不同的账户。

默认情况下,密码使用存储在Odoo配置文件中的密钥进行加密。这远非理想的密码存储配置,但比数据库中的明文密码要好得多。它可以很容易地替换为另一个系统。请参阅下面的“安全”章节。

账户可以是:市场(亚马逊、Cdiscount、…)、运输公司(La Poste、UPS、…)或从Odoo调用的任何第三方系统。

本模块面向开发者。选择账户的逻辑将在相关模块中实现。

用例

交付的可能用例:您需要为同一承运人设置多个账户。这可能是由于承运人限制(不可变的发送地址)或业务规则(每个仓库使用不同的账户)。

配置

安装此模块后,您需要在Odoo的配置文件中添加一些条目:(etc/openerp.cfg)

> keychain_key = fyeMIx9XVPBBky5XZeLDxVc9dFKy7Uzas3AoyMarHPA=

您可以使用以下命令生成密钥:python -c 'from cryptography.fernet import Fernet; print Fernet.generate_key()'

此密钥用于加密账户密码。

如果您计划使用环境,您应该为每个环境添加一个密钥

> keychain_key_dev = 8H_qFvwhxv6EeO9bZ8ww7BUymNt3xtQKYEq9rjAPtrc=

> keychain_key_prod = y5z-ETtXkVI_ADoFEZ5CHLvrNjwOPxsx-htSVbDbmRc=

keychain_key用于无环境设置时的加密。

使用方法(适用于模块开发)

  • 在__manifest__.py中将此密钥链添加为依赖项

  • 继承 keychain.account 子类并在命名空间中添加您的模块:(命名空间名称见下文)

class LaposteAccount(models.Model):
    _inherit = 'keychain.account'

    namespace = fields.Selection(
        selection_add=[('roulier_laposte', 'Laposte')])
  • 添加默认数据(作为字典)

class LaposteAccount(models.Model):
    # ...
    def _roulier_laposte_init_data(self):
        return {
            "agencyCode": "",
            "recommandationLevel": "R1"
        }
  • 实现用户输入数据的验证

class LaposteAccount(models.Model):
    # ...
    def _roulier_laposte_validate_data(self, data):
        return len(data.get("agencyCode") > 3)
  • 在您的代码中获取账户

import random

def _get_auth(self):
    keychain = self.env['keychain.account']
    if self.env.user.has_group('stock.group_stock_user'):
        retrieve = keychain.suspend_security().retrieve
    else:
        retrieve = keychain.retrieve

    accounts = retrieve(
        [['namespace', '=', 'roulier_laposte']])
    account = random.choice(accounts)
    return {
        'login': account.login,
        'password': account.get_password()
    }

在此示例中,随机选择一个账户。通常,这应根据每个客户的特定规则设置。

您必须使用 suspend_security() 函数限制对您的方法的用户访问。

警告:_init_data 和 _validate_data 应以您的命名空间为前缀!选择兼容 Python 命名函数的名称。

从生产环境切换到开发环境

您可以选择以下策略之一

  • 使用开发密钥在生产数据库中存储您的开发账户

  • 使用 Odoo 内置方法导入您的开发账户,如 data.xml(在专用模块中)。

  • 使用您自己的迁移/清理脚本来导入您的开发账户

  • 等等。

注意:只有密码字段在没有适当密钥的情况下才不可读,登录和数据字段在所有环境中都可用。

您还可以使用相同的 技术名称 和不同的 环境 来在运行时选择账户。

用法(针对用户)

转到 设置 / 密钥链,创建以下记录

  • 命名空间:账户类型(例如:Laposte)

  • 名称:可读标签“仓库1”

  • 技术名称:消费者模块使用的名称(例如:“warehouse_1”)

  • 登录:账户登录名

  • 密码_clear:用于输入明文密码(不加密存储)

  • 密码:加密后的密码,没有密钥不可读(在配置中)

  • 数据:附加值的 JSON 字符串(账户的附加配置,例如:{“agencyCode”: “Lyon”, “insuranceLevel”: “R1”})

  • 环境:通常是 prod 或 dev 或空白(对于所有)

Try me on Runbot

已知问题/路线图

  • 默认情况下不支持账户继承(例如定义所有环境的通用设置)

  • 适配与 server_environnement 模块一起使用

  • 密钥过期或轮换应手动完成

  • 从 data.xml 导入密码

安全

此讨论:https://github.com/OCA/server-tools/pull/644 可帮助您决定此模块是否适合您的需求。

常识:Odoo 不是存储敏感数据的安全地方。但有时您别无选择。此模块旨在存储数据如承运人账户、smtp、API 密钥等的凭据,但绝对不是用于信用卡号、医疗记录等。

默认情况下,密码以对称加密 Fernet 加密存储在数据库中。加密密钥存储在 openerp.tools.config 中。

即使在安装此模块的情况下也存在威胁

  • 未经授权的 Odoo 用户想要访问数据:访问被 Odoo 安全规则拒绝

  • 授权的 Odoo 用户尝试使用 rpc api 访问数据:他得到加密的密码,他无法恢复,因为密钥和解密密码没有通过 rpc 暴露

  • 数据库被盗:没有密钥,目前恢复密码相当困难

  • Odoo 被破坏(恶意模块或漏洞):黑客可以访问 Python 并对 Odoo 做他想做的事情:可以轻松解密当前环境的密码

  • 服务器被破坏:相同

如果您的开发服务器被破坏,黑客无法解密您的生产密码,因为您在开发和生产之间有不同的密钥。

如果您想要更安全的东西:不要在 Odoo 中存储任何敏感数据,使用外部系统作为代理,您仍然可以使用此模块来存储与您的账户相关的所有其他数据。

错误跟踪器

错误在 GitHub Issues 上跟踪。如果在出现问题时,请检查您的问题是否已被报告。如果您是第一个发现它的人,请帮助我们将其砸碎,提供详细且受欢迎的反馈。

鸣谢

贡献者

资助者

本模块的开发得到了以下机构的财务支持

  • Akretion

维护者

Odoo Community Association

本模块由OCA维护。

OCA,或Odoo社区协会,是一个非营利组织,其使命是支持Odoo功能的协作开发并推广其广泛使用。

若想为此模块做出贡献,请访问 https://odoo-community.org

项目详情


下载文件

下载适合您平台的文件。如果您不确定该选择哪个,请了解更多关于 安装软件包 的信息。

源代码分发

此版本没有提供源代码分发文件。请参阅 生成分发存档的教程

构建分发

odoo10_addon_keychain-10.0.2.0.2-py2-none-any.whl (125.2 kB 查看哈希值)

上传时间 Python 2

支持者:

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面