OpenERP的权限的核心是权限组(res_groups)。对每个权限组,可以设置权限组的Menus,Access Right,Record Rule。
Menus表示,该权限组可以访问哪些菜单。如果指定某权限组可以访问某父菜单,那么,系统会根据该权限组可访问的对象(Access Right中定义)自动计算,哪些子菜单可以显示。计算规则是,如果没有为该子菜单指定任何权限组,且该权限组对该子菜单关联的对象有至少读的权限,那么,系统会自动显示该菜单。如果不希望系统自动显示某子菜单,只要把该子菜单加入系统自带的“Useability / No One”权限组,该菜单就不会被显示了。“Useability / No One”通常用来隐藏某些菜单,通常不会指定任何用户属于“Useability / No One”权限组。
Access Right表示,该权限组可以访问哪些对象,以及拥有读、写、删、建中的哪个权限。如下图中最后一行,表示,Employee权限组对Partner(res_partner)对象只有读权限。
[attachimg=1]
Record Rule表示,该权限组可以访问对象中的哪些记录,以及拥有读、写、删、建中的哪个权限。Access Right指定的权限,是对该对象的数据表里的所有记录拥有该权限。Record Rule指定,只对该对象的数据表里的某些记录(通过定义过滤条件Domain指定)拥有某些(读、写、删、建)权限。
[attachimg=2]
如上图表示,Employee权限组,对申购单(Purchase Requisition) 对象中,对本部门的,且处于草稿状态的申购单,拥有创建、删除、更新的权限。对于非本部门的或者不是草稿状态的申购单,由于不符合Domain条件,更新或删除时候,系统都会报错。
['&',('department', '=', user.context_department_id.id),('state', '=', 'pr_draft')]
这个Domain条件表示,申购单的部门等于当前用户的部门,申购单的状态是草稿(pr_draft)。系统的实际实现是,在数据库访问的Update, Delete等语句中,强行加上本处定义的Domain条件(因此在系统内部,此处的Domain条件叫“Domain_Force”,哈哈)。
字段权限,还可以指定,某字段只能供某权限组访问。Access Right和Record Rule表示,权限组可以访问哪些对象,以及对象里的哪些记录。而字段权限指定,权限组能访问记录里的哪个字段。如下例表示,只有base.group_admin权限组才可以读、写name字段。
'name': fields.char('Name', size=128, required=True, select=True, write=['base.group_admin'],read=['base.group_admin'] ),
又如下例在视图上指定,只有group_product_variant权限组才能看到产品的variants(规格)字段。
<field name="variants" groups="product.group_product_variant"/>
工作流权限,在工作流的迁移(Transition)的定义中,可以指定哪个权限组可以触发本迁移,定义语法是:<field name="group_id" ref="groupid"/> 。
灵活组合上述权限设置,可以满足非常复杂的权限要求,如工作流的审批权限,菜单的访问权限,记录的访问权限,字段的访问权限,等等。