ODOO权限管理

权限等级

  • 第一级是access rule,即表级(对象)权限,控制用户组对某个对象是否有创建、读取、修改、删除的权限,一般是用security/ir.model.access.csv文件来管理。
  • 第二级是行级权限,控制用户组对表中数据行的访问权限,可以写在views/views.xml文件中。
  • 第三级是字段级权限,一个对象或表上的某些字段的访问权限。
  • 第四级是菜单级权限,不属于指定菜单所包含组的用户看不到该菜单。

其实简单的理解就是

对于数据表Table A

ODOO权限管理_第1张图片

用户能不能看见这个表的内容(字段及数据),就是表级权限

用户能不能看见表A的某行(数据),就是行级权限(记录及权限)

用户是否能看见表A的字段(列),就是字段及权限

对于odoo的菜单,用户是否可见,就是菜单级权限

创建模块

版本:odoo8

(python 2.7环境)

python ./odoo.py scaffold academy ./openerp/addons_test

切换用户到开发者模式
右上角用户,点击关于,页面右上角“激活开发者模式”

更新模块列表
Settings->Modules->Update Modules List

安装模块
Settings->右上角搜索模块名

一、表级权限

新建model

academy/models.py

class Teachers(models.Model):
    _name = 'academy.teachers'

    name = fields.Char('Teacher Name')
    biography = fields.Html()
    user_id = fields.Many2one('res.users', string="User", ondelete='cascade', required="true")

class Courses(models.Model):
    _name = 'academy.courses'
    name = fields.Char()
    teacher_id = fields.Many2one('academy.teachers', string="Teacher")
    course_ids = fields.One2many('academy.courses', 'teacher_id', string="Courses")

给两个表添加基本的视图以及新建两个菜单

academy/views.xml


    
        
            Academy teachers
            academy.teachers
        

        
            Academy teachers: tree
            academy.teachers
            
                
                    
                
            
        
        
            Academy teachers: form
            academy.teachers
            
                
Academy courses academy.courses Academy courses: search academy.courses Academy courses: list academy.courses Academy courses: form academy.courses

表级的权限控制文件在academy/security/ir.model.access.csv

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_academy_teachers,access_academy_teachers,model_academy_teachers,,1,0,0,0

如上的group_id没有加,就是对所有组公开了teacher表的读取权限,重启odoo并升级(admin),切换用户(非admin),可看到效果页面:

ODOO权限管理_第2张图片

可以看到该用户对teacher仅有读取权,但添加、修改、删除不能操作。

二、行级权限

比如访问“客户”对象,业务员只能对自己创建的客户有访问权限,而经理可以访问其管辖的业务员所有的“客户”对象。在ir.rule模型中定义规则,存储在public.ir_rule表格里面。
新建规则文件security/academy_record_rules.xml,并注册到__openerp__.py的data的属性中。

security/academy_record_rules.xml



    
        
            Academy only for owner
            
            
                [('create_uid','=',user.id)]
            
            
        
    
name 规则名称
model_id 对应的模型
global 是否是全局
domain_force 过滤条件,在创建id等于当前用户id时,显示该条记录

groups 属于哪个组base.group_user是所有组,可以不写

security/ir.model.access.csv

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_academy_teachers,access_academy_teachers,model_academy_teachers,,1,1,1,1
access_academy_courses,access_academy_courses,model_academy_courses,,1,0,0,0

先开放teacher模块对所有组的所有权限,重启Odoo并升级academy,登陆非admin用户,可以看到teacher可新建,并只能看见自己创建的数据。

注释

(4,ID)添加主从链接关系到id=ID的对象。

(3,ID)去除和id=ID的对象主从链接关系,但是不删除这个对象

(2,ID) 去除和id=ID的对象主从链接关系,并且删除这个对象(调用unlink方法)

(5) 去除所有的链接关系,也就是循环所有的从数据且调用(3,ID)

(6,0,[IDs]) 用IDs里面的记录替换原来链接的记录,即先执行(5)再循环IDs执行(4,ID)

三、字段级权限

创建用户的权限组使用record记录,存储在res.groups里

security/academy_groups.xml



    
        
            academy test
        
        
            Academy teachers group
            the comment of the group.
            
            
            
        
        
            Academy managers group
            the comment of the group.
            
        
    

首先定义了分组category,然后定义了两个组属于同一分组(也可以不写分组)。

注释

name 组名
comment 组的注释
category_id 所属于哪个模块
users 预定义属于该组的用户
implied_ids

在demo.xml中添加两条记录,创建两个用户
demo.xml

        
            teacherA
            [email protected]
            academy
        
        
            teacherB
            [email protected]
            academy
        

        
            TeacherA
            [email protected]
            
        
        
            TeacherB
            [email protected]
            
        

登陆admin给teacherA添加到academy_teachers_group组,设置->用户 找到teacherA编辑,会看到权限多了分组,勾选Academy teachers group。


给字段添加组权限有两个地方

在视图中给field加groups属性
academy/views.xml

        
            Academy teachers: tree
            academy.teachers
            
                
                    
                    
                    
                    
                
            
        
或者在字段定义的地方加groups属性

academy/models.py

class Teachers(models.Model):
    _name = 'academy.teachers'

    name = fields.Char('Teacher Name')
    biography = fields.Html()
    user_id = fields.Many2one('res.users', string="User", ondelete='cascade', required="true")
    show_group_teacher = fields.Char('Show For Teacher', groups="academy.academy_teachers_group")

重启odoo并升级academy,可以登陆TeacherA和TeacherB查看效果。

四、菜单级权限

在菜单定义处加groups属性(或者groups_id)

academy/views.xml

        
重启odoo并升级academy,可以登陆TeacherA和TeacherB查看效果。

你可能感兴趣的:(odoo,odoo,odoo权限管理)