存储账户和凭证
项目描述
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或空白(所有)
已知问题/路线图
默认情况下,不支持帐户继承(例如,定义所有环境的公共设置)
适配与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 上追踪。如有问题,请检查是否已报告您的问题。如果您是第一个发现的,请通过提供详细且受欢迎的反馈来帮助我们解决它。
鸣谢
贡献者
Raphaël Reverdy <raphael.reverdy@akretion.com>
资助者
本模块的开发得到了以下机构的财务支持
Akretion
维护者
本模块由OCA维护。
OCA,或Odoo社区协会,是一个非营利组织,其使命是支持Odoo功能的协作开发并推广其广泛使用。
要为此模块做出贡献,请访问 https://odoo-community.org。
项目详情
散列值 for odoo11_addon_keychain-11.0.3.0.0-py2.py3-none-any.whl
算法 | 散列摘要 | |
---|---|---|
SHA256 | b2d71599f578ec3ce21156716cc4d3b7aef3d5b011ad2ff515a89bc6d94b0692 |
|
MD5 | e4d0a2f63988fab3185cd5337ce7d223 |
|
BLAKE2b-256 | f3cec0796fb3af8ff039e8e656875d597e460eb92546e523e05a13405d0c93c3 |