浅谈odoo权限

首先引用博主<郭欢欢>整理的一篇文章<Odoo权限机制>

然后在此基础上,自己也研究了一番,有一定的收获。

现整理如下:

  • 从客户端上理解:

首先我们要知道我们使用权限控制的目的是什么?

1、为了解决只有系统最开始创建的用户(管理员级别)能访问并操作相应的模型;

2、为了解决不同的用户类型,访问(可见)不同的单据内容和操作控制;

<------------------------------------------------------------------------------->

为了解决上述问题,我们先要了解几个内容:

1、群组:为了划分不同级别的用户(几乎所有的控制分类,理论最终步骤都在群组部分实现);

2、记录规则:设置单据的访问类别(如:每个人都只能看到自己的单据,管理员能看到所有的单据);

3、访问控制:设置单据的访问权限(如:增删改查等数据操作);

<------------------------------------------------------------------------------->

解决第一个问题的思路是:

1、只要我们创建的模型有对应全局用户访问操作权限(根据自己的业务选择实现)即可;

实现方法可以是界面上添加(缺点是如果要进行升级模块,界面上添加的就会被重置,升级后添加的权限控制就会失效)或在代码里写死;

  • 先讲怎么从界面上实现:

1、直接在debug(调试模式)下进入设置==>技术==>安全==>访问控制列表;

2、添加一条记录:在对象下输入你要写入权限的模型名称,名字任意命名(建议命名稍微有意义,并且能够自己记住),勾上需要的相应访问权限(增删改查),保存刷新即可;

注:群组可选,如果需要相应的群组访问则可选上。

  • 代码实现如下:

1、模块的目录下创建一个security文件夹;

2、在security文件夹下创建ir.model.access.csv文件;

3、写入记录:

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

写入的内容可以找每次执行模块升级时,后台日志推荐的rule写法,例如

The model cus_args.sync_task has no access rules, consider adding one. E.g. access_cus_args_sync_task,access_cus_args_sync_task,model_cus_args_sync_task,,1,0,0,0

对于cus_args.sync_task模块,odoo推荐使用以下记录。

<access_cus_args_sync_task,access_cus_args_sync_task,model_cus_args_sync_task,,1,0,0,0>

值得注意的是,这个<group_id>规则是指定该记录需要用到此访问规则的群组,<group_id:id>默认可以没有值(没有指定群组,则对应全局)。

4、在__manifest__.py的data添加上该文件(和添加xml是一样的方式),升级就可以了。

 <------------------------------------------------------------------------------->

 现解决第二个问题,稍微复杂点:

首先我们假设:有个模型叫销售单<sales.order>,模型所在文件夹<sale_dev>要求是每个销售员只能看到他自己的销售单据,管理员能看到所有销售员的销售单据。

  • 还是先讲怎么只在界面上就能实现

1、既然由两个访问类别,那么肯定由两个访问群组在控制:创建<销售员>群组、创建<销售管理>群组;

注:创建群组时,应用程序(第一个选项)是可选项,两个群组应该使用的相同的应用程序(销售中心)。当然不填写这一栏目也没有关系,只是如果想要添加的群组出现在用户设置的界面,可以写一个上去,就会出现在用户==>访问权界面下。

2、访问控制列表处创建一条记录(假设销售员和管理员对于销售单都能增删改查操作,如果不是,可以针对自己的业务进行添加):

name:<sales_order_control>
model_id: <sales.order>
group_id: <销售员>

注:model_id:指的是对象,填写模型名就可以;group_id:指的是群组

1)group_id选择销售员,在销售管理群组下继承一下销售员就可以将此访问控制写入到销售管理群组下,所以不用担心销售管理会没有访问控制权限。

2)此访问控制记录直接在群组那里也可以添加

3、创建属于关系的访问类别,算是界面上比较关键的地方:

在设置==>技术==>安全==>记录规则 添加

1、创建一条销售员记录(销售员只能访问属于他的销售单据)

  1)name:<sales user>

  2)model_id:<sales.order>

  3)Domain:[('user_id','=',user.id)]

  4)group_id:销售员

注:Domain里面写的就是一个限制方式,这里写的意思是,要求在sales.order模型中,用户id:user_id等于当前用户user的id:user.id。这两个id是一个东西,但在这里的意义不是一样的,一个是模型对象的,一个是当前用户的,可以理解下。

2、创建一条管理员的记录(销售管理能访问销售对应所有的销售单)

  1)name:<sales manage>

  2)model_id:<sales.order>

  3)Domain:[(1, '=', 1)]

  4)group_id:销售管理

注:Domain里写的其实很好理解,1=1这个就是恒等式嘛,永远相等并成立。说的就是在销售管理群组下的用户,都能访问当前模型的记录。

  • 代码实现

1、添加一条群组对应的应用记录(可以理解为该群组是为哪一个应用(模块)写的)--ps:后来在界面上,发现这个记录对于一条群组记录来讲,并不是一条必填项,此记录的存在只是为了区分模块之间的权限辨识,并且可以显示在用户==>访问权里面;

<record model="ir.module.category" id="module_category_sale_center">
    <field name="name">*</field>
    <field name="description">*</field>
    <field name="sequence">*</field>
</record>

   model一定要指定<ir.module.category>,id使用odoo的命名方式:module_category_ 加上模型对应需要合并在一起的模块文件夹名或者py文件名称(源码都有见过,我也不太分得清了),name、description、sequence可以任意自定。其中name是群组的应用名称,description描述、sequence用作设置群组在设置--用户界面的位置

  这里使用和界面一致的命名(name:<销售中心>、description:<>、sequence:<>)

2、添加群组记录(这个就是ir.model.access.csv上记录需要关联的对象了)

<销售员>

<record id="group_sale_user" model="res.groups">
    <field name="name">Sales User</field>
    <field name="category_id" ref="module_category_sale_center"/> 
    <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
</record>

<销售管理>

<record id="group_sale_mange" model="res.groups">
    <field name="name">Sales Manage</field>
    <field name="category_id" ref="module_category_sale_center"/> 
    <field name="implied_ids" eval="[(4, ref('base.group_sale_user'))]"/>
</record>

  值得注意的是<category_id>是上一个写的<model="ir.module.category">对应的id;<implied_ids>则是需要继承的群组,意思是加入该群组则默认加入继承的群组。

3、添加ir.model.access.csv记录

最上面的步骤是一致的,唯一需要区别注意的是:group_id:填写2步骤的对应的群组,填写后才会有在群组==>访问控制界面出现相关记录。

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_sale_order_user,sale.order,model_sale_order,sale_dev.group_sale_user,1,1,1,0
access_sale_order_manage,sale.order,model_sale_order,sale_dev.group_sale_manage,1,1,1,0

4、添加记录规则

<属于自己的销售单据>

<record id="ir_rule_sale_order_user" model="ir.rule">
    <field name="name">Belongs to self</field>
    <field name="model_id" ref="sale_dev.model_sales_order"/>
    <field name="domain_force">[('user_id','=',user.id)]</field>
    <field name="groups" eval="[(4, ref('sale_dev.group_sale_user'))]"/>
</record>

<管理员可见的所有销售单据>

<record id="ir_rule_sale_order_manage" model="ir.rule">
    <field name="name">All sales order</field>
    <field name="model_id" ref="sale_dev.model_sales_order"/>
    <field name="domain_force">[(1, '=', 1)]</field>
    <field name="groups" eval="[(4, ref('sale_dev.group_sale_manage'))]"/>
</record>

 注:需要注意的地方model_id是需要添加记录规则的对应模型、groups:则是需要关联的群组。

做完此步骤,检查一下关联关系。

重启服务,升级模块!

在不同的群组中添加对应的用户,使用不同的用户验证。没有意外的话肯定是现实的!

 

至此,以上关于群组使能的访问控制的操作步骤已全部结束,由于第一次写这类文章,表达不正确的地方请指正!

 <------------------------------------------------------------------------------->

还有一些只想通过菜单级别控制访问的:

有如下规则:

  1)菜单只能控制可见,不能限制访问,如果有一个menu id,也照样可以访问;

  2)菜单控制的访问,还有一些坑在里面。<额外的权利/技术特性>(这个是debug模式下才会显示有的东西)一定不要随便用

怎么使用:

  1)创建群组;

  2)将需要控制显示的菜单添加到菜单列表中;

  3)添加用户(就只用添加的用户能看到控制显示的菜单);

 <------------------------------------------------------------------------------->

~持续待完善~

posted @ 2018-08-17 17:22  NIGangJun  阅读(2627)  评论(0编辑  收藏  举报