美文网首页
权限管理

权限管理

作者: 葡萄柚子茶 | 来源:发表于2019-05-23 16:37 被阅读0次

    在Odoo中,使用用户组(res.groups)来管理权限,一个特殊的用户组是 员工/员工(base.group_user) 组,所有的用户都属于这个组,这个组里包含一些基本的权限。
    四种权限级别(粒度越来越细):
    1.菜单/对象级别
    设置哪些人可以访问哪些菜单/对象,对象的访问权限包括创建、读、写、删除。
    2.记录级别
    设置哪些人可以访问哪些记录,也就是设置表的查询条件。
    3.字段级别
    设置表中的字段的访问权限。
    4.工作流级别(很少用到)
    在工作流的每一步迁移中,设置哪些角色允许触发本迁移

    下面示例使用的是account模块中的代码,所以大家有什么问题可以去odoo源码查询。
    关于权限的文件一般在security文件夹中,
    xxx_security.xml文件定义用户组和用户组对菜单的访问权限
    ir.model.access.csv定义用户组对对象的权限矩阵

    菜单/对象级别

    用户组

    首先创建一个组分类(表示很多组属于一个分类):

    <record id="base.module_category_accounting_and_finance" model="ir.module.category">
        <field name="name">module_category_accounting_and_finance</field>
        <field name="sequence">57</field>
    </record>
    

    再创建一个用户组:

    <record id="group_account_invoice" model="res.groups">
        <!-- 组的名字,如:员工 -->
        <field name="name">Billing</field>
        <!-- 此组属于的组分类 -->
        <field name="category_id" ref="base.module_category_accounting_and_finance"/>
        <!-- 继承的组,也就是说这个组也拥有这些继承组的权限 -->
        <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
    </record>
    

    修改这个组的一些内容,如:给这组加上一个用户:

    <record id="group_account_invoice" model="res.groups">
        <!-- 给这个组添加admin用户 -->
        <field name="users" eval="[(4, ref('base.user_root'))]"/>
    </record>
    

    下面说一下eval语法:

    (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)在循环执行(4, ID))

    用户组对model的权限控制(也就是对象的访问权限)

    模块下 security 目录下的文件:ir.model.access.csv

    id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
    access_product_product_account_user,product.product.account.user,product.model_product_product,group_account_user,1,0,0,0
    access_product_product_account_manager,product.product.account.manager,product.model_product_product,group_account_manager,1,1,1,1
    access_product_template_account_manager,product.template.account.manager,product.model_product_template,group_account_manager,1,1,1,1
    access_product_price_history_account_manager,prices.history.account.manager,product.model_product_price_history,group_account_manager,1,1,1,1
    access_account_payment_term,account.payment.term,model_account_payment_term,account.group_account_`user,1,0,0,0
    

    id:可以随便取,但是在一个模块中是唯一的,一般取名为 access_模型名特定用户组名(用下划线连起来)
    name: 可以随便取,一般命名沿用模型名用“.”连接加 用户组名
    model:id: 要做权限控制的model,格式写法是 模块名.model
    模块名(中间的‘.’换成‘_’),如果model在此模块中,可以省略模块名,如product.model_product_product
    group:id:组的id,不是本模块的组,要在前面加上模块名,如:account.group_account_user
    perm_read,perm_write,perm_create,perm_unlink:这些就是具体的权限:读写增删,1 有权限,0 无权限

    菜单的权限控制

    第一种写法(所有的记录,都可以用这种方法添加及修改,如果id是一样的话就是修改这条记录,如果没有这个id就是添加该记录)

    <record id="menu_finance" model="ir.ui.menu">
        <field name="name">Invoicing</field>
        <field name="web_icon">account,static/description/icon.png</field>
        <field name="sequence">40</field>
        <field name="groups_id" eval="[(6, 0, [ref('account.group_account_user'), ref('account.group_account_manager'), ref('account.group_account_invoice')])]"/>
    </record>
    

    第二种写法(简洁写法)

    <menuitem name="Invoicing"
        id="menu_finance"
        groups="group_account_user,group_account_manager,group_account_invoice"
        web_icon="account,static/description/icon.png"
        sequence="40"/>
    

    上面的2个xml表示menu_finance这个菜单只能被group_account_user,group_account_manager,group_account_invoice 三个用户组访问
    如果有上级菜单,加parent属性,如果上级菜单不在本模块中,需要加模块名如:account.menu_finance:

    <menuitem id="menu_finance_reports" name="Reports" parent="menu_finance" sequence="5" groups="group_account_invoice"/>
    

    记录级别的权限控制

    记录的权限放在"ir.rule"model中,所有我们添加或修改ir_rule表中的记录,就可以控制记录的权限

    <record id="account_move_comp_rule" model="ir.rule">
        <!-- 规则名称 -->
        <field name="name">Account Entry</field>
        <!-- 对应模型 -->
        <field name="model_id" ref="model_account_move"/>
        <!-- 是否全局 -->
        <field name="global" eval="True"/>
        <!-- 过滤条件 其中user表示当前登录用户对象 -->
        <field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field>
        <!-- 读写增删权限(针对过滤后的记录) -->
        <field name="perm_read" eval="True"/>
        <field name="perm_write" eval="False"/>
        <field name="perm_create" eval="False"/>
        <field name="perm_unlink" eval="False"/>
    </record>
    

    字段级别的权限控制

    给字段上添加用户组,表示只有这些组的用户在这个视图中才能访问和操作这个字段,如:

    <record id="view_invoice_line_tree" model="ir.ui.view">
        <field name="name">account.invoice.line.tree</field>
        <field name="model">account.invoice.line</field>
        <field name="arch" type="xml">
            <tree string="Invoice Line">
                <field name="name"/>
                <field name="account_id" groups="account.group_account_user"/>
                <field name="quantity"/>
                <field name="uom_id" groups="product.group_uom,account.group_account_user"/>
                <field name="price_unit"/>
                <field name="discount" groups="base.group_no_one"/>
                <field name="price_subtotal"/>
                <field name="currency_id" invisible="1"/>
            </tree>
        </field>
    </record>
    

    上面xml表示在这个tree视图(这里注意,这个权限只针对这个tree视图)上,account_id,uom_id,discount这3个字段只有对应的用户组中的用户才能看到。
    如果你想在这个model的所有视图中都有这个权限控制的话,要在这个字段定义的时候,就要指定groups,多个用户组用","分隔,如:

    gengo_private_key = fields.Text(string="Gengo Private Key", copy=False, groups="base.group_system,base.group_user")
    

    在项目中的应用

    1.不同权限组看到的数据不同

    <record id="user_combined_statements_rule" model="ir.rule">
                <field name="name">合并报表用户权限</field>
                <field name="model_id" ref="combined_statements.model_combined_statements_project"/>
    #模块名.model_model名
                <field name="groups" eval="[(6,0, [ref('combined_statements.group_combined_statements_user')])]"/>
    #模块名.权限组名
                <field name="perm_read" eval="True"/>
                <field name="perm_write" eval="True"/>
                <field name="perm_create" eval="True"/>
                <field name="perm_unlink" eval="True"/>
                <field name="domain_force">[('code','=','CSJ0001')]</field>
    #过滤数据
            </record>
    
    

    2.不同权限组单个字段只读

    <record id="odoo_res_partner_view_form" model="ir.ui.view">
                <field name="name">res.partner.form.inherit</field>
                <field name="model">res.partner</field>
                <field name="inherit_id" ref="base.view_partner_form" />
                <field name="groups_id" eval="[(6,0, [ref('update_account.group_ir_exports_normal_user')])]" />
                <field name="arch" type="xml">
                    <field name="name" position="attributes">
                       <attribute name="readonly">1</attribute>
                    </field>
                </field>
    </record>
    

    相关文章

      网友评论

          本文标题:权限管理

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