iT邦幫忙

2023 iThome 鐵人賽

DAY 5
0
Odoo

Odoo16 入門介紹系列 第 5

Day5_odoo_Security

  • 分享至 

  • xImage
  •  

Security

我們在創建權限的時候,一定要在__manifest__.py中加入,而且必須以權限大的優先排列:

'data': [
    'security/groups.xml',
    'security/ir.model.access.csv',
    'views/library_book.xml'
    ],

○ 權限分類

通常創建權限3個面向
  1. 對象級別 - 對DB的訪問權,可以對recordset進行CRUD的操作。
  2. 視圖級別 - 不同用戶組所能看到的畫面呈現與細項。
  3. 字段級別 - 對字段的訪問權限,而字段指的就是DB中Table裡的資料。

○ create group

收仙我們來創建群組,我們要先在__manifest__.py中寫入:

'catetgory':'library',

※這個設定使的odoo會生成module_category_library在base下。

再來新增我們groups.xml的檔案:

'data': [
    'security/groups.xml',
                .
                .
    ],

開始創建 User 與 Librarian 的群組:

<odoo>
    <record id='library_user' model='res.gruops'>
        <field name="name">User</field>
        <field name="category_id" ref="base.module_category_library"/>
        <field name="implied_ids" eval="[(4,ref("base.group_user"))]"/>
    </record>
    
    <record id='library_librarian' model='res.gruops'>
        <field name="name">Librarian</field>
        <field name="category_id" ref="base.module_category_library"/>
        <field name="implied_ids" eval="[(4,ref("library_user"))]"   <!--─╥──(user+user_admin的權限)  -->
        <field name="users" eval="[(4,ref("base.user_admin"))]"/> <!--────╜    -->
    </record>
</odoo>

○ model access

通常檔案的名稱就叫做ir.model.access.csv

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
acl_book,library.book_default,model_library_book,group_library_user,1,0,0,0
acl_book_librarian,library.book_librarian,model_library_book,group_library_librarian,1,1,1,1

○ 權限(0,0,{})~(6,0,[])

(0,0,{a:b})   - 創建record,並且將{a:b}關聯
(1,id,{a:b})  - 更新id值為id的record,並且將{a:b}關聯
(2,id,)       - 刪除id值為id的record
(3,id,)       - unlink id值為id的record
(4,id,)       - link id值為id的record
(5,0,0)       - 刪除所有的 link record
(6,0,[ids])      - 替換現有的 link record

範例:假設我們想限制model字段的訪問:

is_public = fields.Boolean(group="my_library.group_library_user")
private_notes = fields.Text(group="my_library.group_library_librarian")

ir.rule

當我們想要限制record的訪問,我們會創建Security/library_security.xml,比如說user可以看自己的書
,librarian可以看到所有的書

<odoo noupdate="1">
    <record id="library_book_user_rule" model="ir.rule">
        <field name="name">Library: See only own books</field>
        <field name="model_id" ref="model_library_book"/>
        <field name="groups" eval="[(4, ref('my_library.group_library_user'))]"/>
        <field name="domain_force">[('is_public','=',True)]</field>
    </record>
    
    <record id="library_book_all_rule" model="ir.rule">
        <field name="name">Library: See all books</field>
        <field name="model_id" ref="model_library_book"/>
        <field name="groups" eval="[(4, ref('my_library.group_library_librarian'))]"/>
        <field name="domain_force">[(1,'=',1)]</field>
    </record>
</odoo>

○ superuser -sudo()

當我們在畫面中,不是user權限內可以使用的功能時,我們可以使用sudo()與ensure_one():

def report_missing_book(self):
    self.ensure_one()
    message = "Book is missing (Reported by: %s)" % self.env.user.name
    self.sudo().write({
        'report_missing': message
    })

※如果我們想要隱藏menu或是header的話,我們也可以使用groups:

<menuitem id='library_book_category_menu' name='book category'
          parent='library_book_category_form' 
          groups='my_library.group_library_librarian'/>
    .
    <form>
        <header groups="my_library.group_library_user".....>
            .
            .
        </header>
        .
        .
        .
    </form>
    .

※我們也可以透過XML中的<delete><function>來做操作:
我們可以透過<delete>來進行刪除:

<delete model=ir.model.access search='[('id','=',ref(library.library_book_user_rule))]'>

或是透過<function>來觸發函式:

<function model="library.book" name="book_missing" eval="[ref('book_id'),ref('book_author')]">

上一篇
Day4_odoo_Model介紹(2)
下一篇
Day6_odoo_基本View
系列文
Odoo16 入門介紹30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言