Odoo 模型访问规则未按预期工作

Odoo model access rule is not working as expected

型号:-

from odoo import models, fields, api

courses = [
    ('mca', "MCA"),
    ('bca', "BCA"),
    ('bsc', "B.Sc"),
    ('msc', "M.Sc"),
    ('btech', "B.Tech"),
    ('mtech', "M.Tech"),
]

class openacademy(models.Model):
    _name = 'openacademy.student'

    name = fields.Char(string="Student Name")
    roll = fields.Integer(string="Roll Number")
    course = fields.Selection(courses, string="Course")

群组:-

<record model="ir.module.category" id="category_openacademy">
    <field name="name">Open Academy</field>
    <field name="sequence">10</field>
</record>

<record id="group_student" model="res.groups">
    <field name="name">Student</field>
    <field name="category_id" ref="category_openacademy"/>
    <field name="comment">Basic access</field>
</record>

<record id="group_teacher" model="res.groups">
    <field name="name">Teacher</field>
    <field name="category_id" ref="category_openacademy"/>
    <field name="comment">Complete Access</field>
</record>

模型访问规则 (ir.model.access.csv):-

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
ACL_st,oa.ACL_st,model_openacademy_student,group_student,1,0,0,0
ACL_te,oa.ACL_te,model_openacademy_student,group_teacher,1,1,1,1
ACL_ng,oa.ACL_ng,model_openacademy_student,,1,1,1,1

现在,如果学生组用户登录应用程序,则他可以 write/delete 记录,但只有读取权限。

我希望如果登录用户不属于任何组,那么他可以执行任何操作,这就是我添加此规则的原因:-

ACL_ng,oa.ACL_ng,model_openacademy_student,,1,1,1,1

问题和你猜的一样:

ACL_ng,oa.ACL_ng,model_openacademy_student,,1,1,1,1

那个让学生做任何事情。

问题是组权限是通过 OR 加入的。属于 group_student 的用户将受到两个模型访问行的影响:

ACL_st,oa.ACL_st,model_openacademy_student,group_student,1,0,0,0
ACL_ng,oa.ACL_ng,model_openacademy_student,,1,1,1,1

因此,由于 0 OR 11,他们可以读取、创建、写入和删除。

因此,我将执行以下操作:

我会替换行:

ACL_ng,oa.ACL_ng,model_openacademy_student,,1,1,1,1

这一行:

ACL_ng,oa.ACL_ng,model_openacademy_student,base.group_user,1,1,1,1

该行确保每个用户都可以使用 openacademy.student 模型做任何事情。

现在我们必须告诉 Odoo 学生只能阅读,所以我会创建一个规则,通过 AND.

连接
<record model="ir.rule" id="model_openacademy_student_group_student_rule">
    <field name="name">openacademy_student: students can only read</field>
    <field name="model_id" ref="model_openacademy_student"/>
    <field name="domain_force">[(1, '=', 1)]</field>
    <field name="groups" eval="[(4, ref('group_student'))]"/>
    <field name="perm_create" eval="False"/>
    <field name="perm_unlink" eval="False"/>
    <field name="perm_write" eval="False"/>
</record>

因此,由于 1 AND 00,属于 group_student 的用户将不允许创建、写入也不会从 openacademy.student 模型中删除记录。根据记录值应用规则,但使用 domain_force -> [(1, '=', 1)] 我们确保每条记录都受我们的规则影响。

另一方面,标准用户(每个用户都属于 base.group_user 因为 默认用户 属于它 - 请参阅 base 模块,base_security.xml-) 不会受到仅适用于 group_student 的规则的影响,因此他们仍然可以从 openacademy.student 创建、写入和删除记录.属于 group_teacher.

的用户也是如此