除了使用自定义代码管理访问外,Odoo主要以数据驱动的方式进行权限管理。这种机制通过组与特定用户相关联:用户属于一个或多个组,权限与组关联,从而将权限应用于用户。
模型权限
通过ir.model.access
的记录行进行管理,定义模型的访问权限。每个访问权限项对应一个模型,组(一个或者没有)以及相应的权限。
模型权限是加法的,对于给定的模型,用户的访问权限是用户所在的全部组的权限的集合。例如:用户属于两个组,一个组有写入权限,另外一个组有删除权限,则用户拥有写入和删除权限。
如果模型权限未指定组,则访问权限适用于所有用户,否则仅适用于给定组的成员。可用的权限包括:
perm_create:创建
perm_read:阅读和搜索
perm_write:更新已有记录
perm_unlink:删除已有记录
记录行规则
记录行规则是对记录行的操作权限(创建、读取、更新和删除)控制。在应用了模型权限后再应用记录行规则。记录行规则的定义包括:
- 规则对应的模型权限
- 规则适用的一组权限(例如,如果设置了
perm_read
,则只有在读取记录时才会检查该规则) - 规则适用的一组用户组,如果没有指定组,则该规则是全局的
- 规则适用的记录行,用domain来定义,符合domain规则的可访问,不符合的则不能访问。这里的domain有两个上下文可以使用:
user
是当前用户的记录行,time
是时间模块。
全局规则(规则中未指定组)和组规则(规则中指定了组)的使用方式截然不同: - 全局规则是减法的,必须全部匹配才能访问记录
- 组规则是加法的,其中任何一个匹配(并且全部的全局规则都匹配)就能访问记录
这意味着第一个组规则限制记录的访问,但是其它的所有组规则都在扩展访问。而全局规则是每一个规则都在限制记录的访问(或者不起作用)。
警告
记录行规则和模型权限对于管理员用户无效,管理员用户拥有完全权限
字段权限
这个是在7.0版本之后新增的。ORM的Field
有一个groups
属性,这个属性可以定义一个组的列表(以逗号分隔的标识符)。如果当前用户不是这个组列表中的任一组成员,那当前用户不能访问这个字段:
- 受限制的字段将在视图请求中被自动移除
- 受限制的字段将在
fields_get()
请求中被移除 - 如果尝试(显示的)读取或写入受限制字段会导致访问错误
工作流流转规则
工作流流转可以限制在一个特定的组中,组外的用户无法触发转换。