美文网首页odoo
odoo权限机制

odoo权限机制

作者: 守望村夫 | 来源:发表于2017-06-02 14:17 被阅读177次

    *权限管理的四个层次

    # 菜单级别:不属于指定菜单所包含组的用户看不到该菜单,不客全,只是隐藏

    菜单,若知道菜单ID,仍然可以通过指定URL访问

    # 对象级别:对某个对角是否有'创建,读取,修改,删除'的权限,可以简单理解为

    表对象

    # 记录级别:对对象表中的数据的访问权限,比如访问“客户”对象,业务员只能对自己创建

    的客户有访问权限,而经理可以访问其管辖的业务员所有的“客户”对象

    # 字段级别:一个对象或表上的某些字段的访问权限,比如产品的成本字段只有经理有读权限

    'name':fields.char('Name',size=128,required=True,select=True,write=['base.group_admin']

    read=['base.group_admin'])

    定义name字段只能超级用户组可读写

    * 建立权限组

    这是我们常说的用户组,会通常放在“模块名_security.xml”这个文件中

    例如:

    Manager

    the user will have an access to the human resources configuration as well as statistic reports.

    @name:用户组名,这个或以翻译的

    @comment:用户组的注释

    @category_id 用户组所属的模块名

    @implied_ids 基于哪个用户组,这个层级关系 是最基础的

    用户名,最初是基于这个,后面一层一层递增,像上面 base.group_hr_user 定义时就是基于最基础

    @users 预设用户属于这个用户组

    * 权限组

    权限管理核心是权限组,每个权限组,可以设置权限组的 Menus,Access Right, Record Rule

    # Menus:

    定义该权限组可以访问哪些菜单,若该权限组可以访问某父菜单,父菜单对应的子菜单会显示出来

    若不想显示其子菜单,可以把其子菜单加入 "Useablity/No One" 权限组。

    # Access Right:

    定义该权限组可以访问哪些对象,以及拥有 增、查、改、删的哪个权限    (create,read,write,unlink)

    # Record Rule:

    定义该权限组可以访问对象中的哪些记录,以及拥有 增、查、改、删的哪个权限    ,Access Right是

    对对象中的所有记录赋权限,Record Rule 则通过定义domain过滤指定某些记录赋权限

    ['&',('department','=',user.context_department_id.id),('state','=','pr_draft')]

    申购单的部门等于当前用户的部门,且申购单的状态是草稿状态

    * 基于组的访问控制

    # 视图中

    运用group_id

    sale.order.form.editable.list

    sale.order

    ref('product.group_stock_packaging'),

    ref('sale.group_mrp_properties')])]" />

    eval:把eval的值通过作为python运算返回该属性

    ref:视图的方法,根据 module_name.xml_id 返回数据库id

    [(6,0,[xx,yy])]

    (0,_ ,{’field’: value}) 这将创建一个新的记录并连接它

    (1,id,{’field’: value}): 这是更新一个已经连接了的记录的值

    (2,id,_) 这是删除或取消连接某个已经连接了的记录

    (3,id,_) 这是取消连接但不删除一个已经连接了的记录

    (4,id,_) 连接一个已经存在的记录

    (5,_,_) 取消连接但不删除所有已经连接了的记录

    (6,_,[ids]) 用给出的列表替换掉已经连接了的记录

    这里的下划线一般是0或False

    运用groups

    attrs="{'invisible': ['|', ('state','!=','open'), ('sent','=',True)]}" groups="base.group_user"/>

    #在模型中

    package_id = fields.Many2one(

    comodel_name='stock.quant.package', string='Package',

    related='quant.package_id', readonly=True,

    groups="stock.group_tracking_lot")

    要有多个用户组时,用户组之间用逗号隔开

    #小结

    只有在视图中有完整标签时,会用group_id,其它都用groups

    *访问权限管理:

    对于其内的数据访问权限管理有两种机制:

    第一种是模型访问权限管理 (accessrule);

    第二种是记录规则管理 (record rule)。

    record rule 是对accessrule的细化 ,带条件,比如记录是什么状态的可以访问

    如果不为模块设置规则,默认只有Administator才能访问这个模型的数据

    record rule 对 Administator 用户是无效的,而access rule还是有效

    # access rule

    权限对象模型是 ir.model.access.csv

    一般是放在security 文件夹下的 ir.model.access.csv 文件来管理的

    文件表头如下:

    id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink

    来一个例子:

    id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink

    access_payment_notice_account_user,payment.notice.account.user,model_payment_notice,account.group_account_user,1,1,1,1

    access_payment_notice_sale_user,payment.notice.sale.user,model_payment_notice,base.group_sale_salesman,1,1,0,0

    分析这个是针对 payment.notice 这个模型做访问权限设置

    可以看一下对应模型定义的代码:

    class PaymentNotice(models.Model):

    _name = "payment.notice"

    id:权限的ID不可重复 一般取名为 access_模型名_特定用户组名(用下划线连起来)

    name 描述 一般命名沿用模型名用“.”连接加 用户组名

    model_id:id:对象,命名是model_模型名(用下划线连起来)

    group_id:id  组名称 (模块.用户组名)

    下面的,0 表示无权限, 1 表示有权限

    perm_read  只读

    perm_write 修改

    perm_create 创建

    perm_unlink 删除

    # record rule

    一般是放在security 文件夹下的 模块名_record_rules.xml 文件来管理的

    对于模型权限的补充

    Personal Payment Notice

    ['|',('claimed_user_id','=',user.id),('claimed_user_id','=',False)]

    All Payment Notice

    [(1,'=',1)]

    record rule    记录是 ir.rule 模型, 存在public.ir_rule 表格中

    model_id 作用于哪个模型 值为 model_模型名

    domain_force 对该模型中所有记录进行某种过滤操作

    常用的 ['|',('user_id','=',user.id),('user_id','=',False)] 表示是自己的单

    user_id是记录的字段,这个看实际情况改变, user.id 代表当前登录用户的id

    [(1,'=',1)] 表示所有的单

    noupdate 值为1 表示升级模块不会更新本数据

    base.group_user 是人力资源 / 雇员

    perm_read 这些后面,是对 前面模型权限组设定的覆盖

    * 来一个完整的例子解说:

    # 建立组

    A

    //把admin用户加入该组中

    @ name 组名称

    @ category_id 属于哪个应用程序,或者哪个模块,为了方便管理

    @ users 组里面的用户

    这样B应用程序就建立了一个名叫A的组。并且初始化了A组的一个用户admin

    # 组控制菜单显示

    A

    menu1

    1

    @ name 菜单名称

    @ groups_id 哪些组可以访问该菜单

    @ sequence 该菜单的序号

    这样A组与B组的成员都可以访问menu1菜单,menu1菜单的显示顺序为1

    注:eval 后面解释,多个组访问用“,”隔开

    @ name 菜单名称

    @ parent 父类菜单 如果没有可以不写parent

    @ groups哪些组可以访问该菜单

    这样menu1的子菜单menu2可以被A组合B组的成员访问

    # 权限规则

    rule1

    [1,’=’,1]

    @ name 规则名称

    @ model_id 依赖的模块

    @ global 是否是全局

    @ domain_force 过滤条件

    @ groups 属于哪个组

    这样A组的成员就可以取到model_model1的所有数据

    # ir.model.access.csv

    @id 随便取

    @name 随便取

    @model_id:id 这个就是你所定义的对象了

    @group_id:哪个组

    @perm_read","perm_write","perm_create","perm_unlink" 增删改查权限了。1代表有权限

    # Eval

    many2many

    (0,0,{values}) 根据values里面的信息新建一个记录。

    (1,ID,{values})更新id=ID的记录(写入values里面的数据)

    (2,ID) 删除id=ID的数据(调用unlink方法,删除数据以及整个主从数据链接关系)

    (3,ID) 切断主从数据的链接关系但是不删除这个数据

    (4,ID) 为id=ID的数据添加主从链接关系。

    (5) 删除所有的从数据的链接关系就是向所有的从数据调用(3,ID)

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

    例子[(6, 0, [8, 5, 6, 4])] 设置 many2many to ids [8, 5, 6, 4]

    one2many

    (0, 0,{ values })根据values里面的信息新建一个记录。

    (1,ID,{values}) 更新id=ID的记录(对id=ID的执行write 写入values里面的数据)

    (2,ID) 删除id=ID的数据(调用unlink方法,删除数据以及整个主从数据链接关系)

    例子:

    [(0,0,{'field_name':field_value_record1,...}),(0,0,{'field_name':field_value_record})]

    many2one的字段比较简单,直接填入已经存在的数据的id或者填入False删除原来的记录。

    # 隐藏的常用技巧

    * 直接隐藏

    True

    * 满足某些条件的隐藏

    {'invisible': [('passenger','=', True)]}

    * 通过组来隐藏

    base.group_no_one

    * 菜单的隐藏

    * 代码分析中的运用

    #字段显示权限

    #在model中判断

    self.pool.get('res.users').has_group(cr, uid, 'sale.group_discount_per_so_line')

    相关文章

      网友评论

        本文标题:odoo权限机制

        本文链接:https://www.haomeiwen.com/subject/kpkufxtx.html