设置访问权限
在加载服务时,你可能会注意到输出日志中有一条警告信息:
The model library.book has no access rules, consider adding one.
提示消息已经很明确了,我们的新模型没有访问规则, 所以任何人都可使用。我们已为应用添加了安全组,现在就为模块授权。
“ 小贴士: 在 Odoo 12 以前, admin 可自动访问所有数据模型,它是一个不受权限控制的超级用户。在 Odoo 12 中则不再如此,需要在新模型中设置 ACL 才对 admin 可见。 ”
添加访问权限控制
Technical > Security >
Access Rights:这里可以看到一些模型的 ACL(Access Control List),表示允许每个安全组对记录的操作。这一信息需要通过模块中的数据文件提供,然后载入 ir.model.access 模型。我们将为 employee 组添加该模型的所有权限,内部用户是几乎所有人隶属的基本权限组。
“ 注意: Odoo 12 的修改User 表单现在有一个用户类型,仅在开启开发者模式时显示。它允许互斥的几个选项:内部用户, portal 门户用户(外部用户如客户)和 public 公共用户(网站匿名访客)。这一修改用于避免把内部用户放到 portal 或 public 组中一类的错误配置,那样会导致权限的丧失。 ”权限通过 security/ir.model.access.csv 文件来实现,添加该文件并加入如下内容
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_book_user,BookUser,model_library_book,library_group_user,1,0,0,0
access_book_manager,BookManager,model_library_book,library_group_manager,1,1,1
,1
注:应注意该文件第一行后不要留有空格,否则会导致报错
文件名必须与要载入的模型对应,第一行为列名, CSV 文件中有如下列:
⚫ id 是记录的外部标识符(也称为 XML ID),需在模块中唯一
⚫ name 是描述性标题,仅在保证唯一时提供有用信息
⚫ model_id 是赋权模型的外部标识符,模型有 ORM 自动生成的 XML ID,对于
library.book,标识符为 model_library_book
⚫ group_id 指明授权的安全组,我们给前文创建的安全组授权: library_group_user 和
library_group_manager
⚫ perm_…字段标记 read 读, write 写, create 创建, 或 unlink 删除权限,我们授予普通用户
读权限、管理员所有权限
还应记得在__manifest__.py 的 data 属性中添加对新文件的引用,修改后如下:
'data': [
'security/library_security.xml',
'security/ir.model.access.csv',
'views/library_menu.xml',
],老规矩升级模块让修改生效,此时警告信息就不见了。我们通过 admin 登录来检测权限是否正确, admin 属于图书管理员组
行级权限规则
我们知道默认 active 标记为 False 的记录不可见,但用户在需要时可使用过滤器来访问这些
记录。假设我们不希望普通图书用户访问无效图书,可通过记录规则来实现,即定义过滤器来限制某权限组所能访问的记录。这位于 Settings > Technical > Security > Record Rules。
记录规则在 ir.rule 中定义,和往常一样我们选择一个唯一名称。还应获取操作的模型及使用权限限制的域过滤器。域过滤器使用 Odoo 中常用的元组列表,在第八章业务逻辑将讲解域表达式语法。
通常,规则应用于指定安全组,我们这里应用的是雇员组。如果没有指定的安全组,则应用于全局(global 字段自动设为 True)。全局规则不同,它们做的限制非全局规则无法重载。要添加记录规则,需编辑 security/library_security.xml 文件添加如下代码:
<data noupdate="1">
<record id="book_user_rule" model="ir.rule">
<field name="name">Library Book User Access</field>
<field name="model_id" ref="model_library_book" />
<field name="domain_force">
[('active','=',True)]
</field>
<field name="groups" eval="[(4,ref('library_group_user'))]" />
</record>
</data>
记录规则位于元素中,表示这些记录在模型安装时会被创建,但在模型更新时不会被重写。这么做是允许对规则在后面做自定义但避免在执行模型升级时自定义内容丢失。
“ 小贴士: 开发过程 noupdate=” 1″会带来麻烦,因为要修复规则时模块更新不会在数据库中重写数据。所以在开发时可以修改为 noupdate=” 0″来让数据达到预期结果。 ”
在 groups 字段中,会发现有一个特殊表达式,这是一个带有特殊语法的 one-to-many 关联字段。元组(4, x)表示 x 应添加到记录中, 此处 x 为一个标记为 base.group_user 的内部用户组引用。针对多个字段的这种特殊语法在第六章模型中探讨。