跳转到主要内容

存储账户和凭证

项目描述

License: AGPL-3

Keychain账户

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

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

  • 无需努力即可实现多账户。

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

  • 附加数据的验证规则。

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

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

账户可以是:市场(亚马逊、Cdiscount等)、承运人(Laposte、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(在一个专用模块中)

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

  • 等等。

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

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

用法(针对用户)

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

  • 命名空间:帐户类型(例如:La Poste)

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

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

  • 登录:帐户登录名

  • Password_clear:用于以明文形式输入密码(不加密存储)

  • Password:加密密码,没有密钥无法读取(在配置中)

  • Data:附加值的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

项目详情


下载文件

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

源代码分发

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

构建分发

odoo11_addon_keychain-11.0.3.0.0-py2.py3-none-any.whl (112.1 kB 查看散列值)

上传时间 Python 2 Python 3

由以下机构支持

AWSAWS 云计算和安全赞助商 DatadogDatadog 监控 FastlyFastly CDN GoogleGoogle 下载分析 MicrosoftMicrosoft PSF赞助商 PingdomPingdom 监控 SentrySentry 错误日志 StatusPageStatusPage 状态页面