第五章 关于安全简单的介绍
在前一章节中,我们创建了第一个table用来存储商业数据,在像Odoo这样的商业应用中,要考虑的第一个问题就谁来可以存取数据,Odoo提供了一种安全机制允许特定的用户组的的人来存取数据。
关于安全的细节在 Restrict access to data. 这一章只覆盖关于新模块的最小需要。
Data Files (CSV)
Odoo是一个高度数据驱动的系统。虽然可以通过python代码来定义逻辑,模块的部分数据在加载的时候就设置好了。
加载数据的一种方法就是通过CSV文件,一个例子是 list of country states 当base模块安装的时候就加载到数据库了。
"id","country_id:id","name","code"
state_au_1,au,"Australian Capital Territory","ACT"
state_au_2,au,"New South Wales","NSW"
state_au_3,au,"Northern Territory","NT"
state_au_4,au,"Queensland","QLD"
...
- ID是一个外部标志符,可以通过它引用这条记录而不需要在数据库的ID
country_id:id
指向国家的外部IDname
州的名字code
州的简写
这个三个字段在res.country.state模型中被定义。
通常来说,一个数据文件的位置在模块的“data”目录中。 当数据跟安全有关,它将会放在“security”目录中,当数据跟视图(views)和动作(action)有关,它将被放在“views”目录中,另外,所有的这些文件必须在清单文件的data列表中被声明。 我们的例子是base模块的清单文件。
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name': 'Base',
'version': '1.3',
'category': 'Hidden',
'description': """
The kernel of Odoo, needed for all installation.
===================================================
""",
'depends': [],
'data': [
'data/res.lang.csv',
'data/res_lang_data.xml',
'data/res_partner_data.xml',
'data/res_company_data.xml',
'data/res_users_data.xml',
'data/report_paperformat_data.xml',
'data/res_currency_data.xml',
'data/res_country_data.xml',
'data/ir_demo_data.xml',
'security/base_groups.xml',
'security/base_security.xml',
'views/base_menus.xml',
'views/decimal_precision_views.xml',
'views/res_config_views.xml',
'data/res.country.state.csv',
'views/ir_actions_views.xml',
'views/ir_config_parameter_views.xml',
'views/ir_cron_views.xml',
'views/ir_filters_views.xml',
'views/ir_mail_server_views.xml',
'views/ir_model_views.xml',
'views/ir_attachment_views.xml',
'views/ir_rule_views.xml',
'views/ir_sequence_views.xml',
'views/ir_translation_views.xml',
'views/ir_ui_menu_views.xml',
'views/ir_ui_view_views.xml',
'views/ir_default_views.xml',
'data/ir_cron_data.xml',
'report/ir_model_report.xml',
'report/ir_model_templates.xml',
'views/ir_logging_views.xml',
'views/ir_qweb_widget_templates.xml',
'views/ir_module_views.xml',
'data/ir_module_category_data.xml',
'data/ir_module_module.xml',
'report/ir_module_reports.xml',
'report/ir_module_report_templates.xml',
'wizard/base_module_update_views.xml',
'wizard/base_language_install_views.xml',
'wizard/base_import_language_views.xml',
'wizard/base_module_upgrade_views.xml',
'wizard/base_module_uninstall_views.xml',
'wizard/base_export_language_views.xml',
'wizard/base_update_translations_views.xml',
'wizard/base_partner_merge_views.xml',
'wizard/base_document_layout_views.xml',
'data/ir_actions_data.xml',
'data/ir_demo_failure_data.xml',
'views/res_company_views.xml',
'views/res_lang_views.xml',
'views/res_partner_views.xml',
'views/res_bank_views.xml',
'views/res_country_views.xml',
'views/res_currency_views.xml',
'views/res_users_views.xml',
'views/ir_property_views.xml',
'views/res_config_settings_views.xml',
'views/report_paperformat_views.xml',
'views/onboarding_views.xml',
'security/ir.model.access.csv',
],
'demo': [
'data/res_company_demo.xml',
'data/res_users_demo.xml',
'data/res_partner_bank_demo.xml',
'data/res_currency_rate_demo.xml',
'data/res_bank_demo.xml',
'data/res_partner_demo.xml',
'data/res_partner_image_demo.xml',
],
'test': [],
'installable': True,
'auto_install': True,
'post_init_hook': 'post_init',
}
另外注意,数据文件只有在一个模块安装或者升级的时候加载。
警告:
数据文件是按照他们在清单文件中的顺序逐一加载,这意味着如果数据A依赖数据B,那么你必须要确保数据B在加载数据A之前就加载了。
在国家和州的例子中,你将注意到,国家数据在州数据前被加载,这是因为州数据引用了国家数据。
为什么这些很重要? 因为一个模块所有的安全配置都是通过数据文件来加载,我们将在下一小节中看到。
Access Rights
参考: 关于这个主题的文档在这里 Access Rights.
注意:
目标: 在这一小节的最后,下面的警告将不会再出现
WARNING rd-demo odoo.modules.loading: The models ['estate.property'] have no access rules...
当一个模块没有存取权限被定义,Odoo会认为没有用户可以存取数据,log中会出现下面的提醒:
WARNING rd-demo odoo.modules.loading: The models ['estate.property'] have no access rules in module estate, consider adding some, like:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
存取权限作为ir.model.access模型的的记录被定义, 每个存取权限都关联到一个模型, 一个用户组(或者没有用户组表示全局的存取)和一组权限:create, read, write and unlink。 这些访问权限通常被定义文件名叫ir.model.access.csv的文件中。
这里是一个例子,关乎之前的的test.model
:
id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink
access_test_model,access_test_model,model_test_model,base.group_user,1,0,0,0
id
是以外部标识符name
是ir.model.access`中的名字model_id/id
指向对应的模型. 引用模型的标准方式是model_<model_name>
, where<model_name>
是模型的_name属性将其中的“.”替换成“__” ,看上去很麻烦码? 确实是:(group_id/id
指向授予权限的用户组perm_read,perm_write,perm_create,perm_unlink
: 读,写,创建,删除权限。
练习:
增加存取权限
创建ir.model.access.csv
文件在合适的目录中并定义在清单文件中。
富裕读、写、新增,删除权限给base.group_user
.
Tip: log中警告信息已经给了你解决方案了:-)
重启服务,警告信息将不会出现了。
现在是时候跟UI交互了。
总结一波:
odoo是一个高度数据驱动的系统
如果没有给一个表定义访问权限,那么控制台会报一个错误
2023-05-10 07:27:27,964 346507 WARNING odoo odoo.modules.loading: The models ['estate.property'] have no access rules in module estate, consider adding some, like:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
estate.access_estate_property,access_estate_property,estate.model_estate_property,base.group_user,1,0,0,0
权限会定义ir.model.access表中, 每条访问规则包含三个元素:
模型:
用户组:(也可能没有用户组,是整体的访问权限)
访问权限:perm_read,perm_write,perm_create,perm_unlink