Mengatur Hak Akses (Security)

Agar lebih mudah memahaminya, mari kita kelompokkan hak akses ini menjadi 3 bagian :

  1. Akses terhadap model/object (CRUD – Create, Read, Update, Delete)
    Misalnya mengatur apakah user mempunyai akses Read terhadap object ms.pendaftaran atau tidak? Jika ya maka dia bisa melihat data-data yang ada di object ms.pendaftaran
  2. Akses terhadap menu, fields, button
    User sudah mempunyai akses Read terhadap object ms.pendaftaran tapi dia tidak boleh mengetahui nama pasien yang mendaftar. Maka kita bisa menyembunyikan field pasien dari user bersangkutan. Begitupun dengan button dan menu kita bisa mengatur kepada user siapa saja button dan menu tersebut akan dimunculkan
  3. Akses terhadap spesifik data/record
    Meskipun user sudah mempunyai akses Read terhadap object ms.pendaftaran juga terhadap menu, fields dan button. Tapi dia hanya boleh melihat data pendaftaran yang poli tujuannya adalah poli jantung dan tidak boleh melihat poli lainnya. Maka hal tersebut bisa diatur di sini

Itulah kurang lebih pengelompokkan hak akses di odoo. Dalam penjelasan singkat di atas saya memberikan gambaran jika hak akses tersebut diterapkan pada object ms.pendaftaran di modul ms_puskesmas yang pernah saya berikan di Belajar Odoo Untuk Pemula [Part 8/8]. Jika anda tidak mengikutinya silahkan download di sini karena dalam tutorial ini saya akan menggunakan modul tersebut.

Untuk membuat setting hak akses ini kita bisa melakukannya melalui coding ataupun langsung melalui aplikasi. Dan sekarang kita akan membuatnya melalui aplikasi.

Pertama-tama silahkan instal modul yang sudah didownload, tapi sebelumnya anda harus comment dulu baris “security/ir.model.access.csv” di __manifest__.py karena kita akan membuat semua hak akses melalui aplikasi

Mari kita mulai dengan membuat user baru dengan nama Agus dengan setting seperti berikut

Kemudian set password dengan klik button Change Password. Isi password bebas

Buka tab incognito atau private browser dan coba login dengan user Agus

Ada 2 top menu (Discuss dan Puskesmas), satu grup menu (Data Master) dan 3 menu yang pertama kali muncul saat login menggunakan user Agus. Kenapa demikian?

  1. Ketiga menu tersebut beserta grup menu Data Master dan top menu Puskesmas merupakan menu baru yang kita buat di modul ms_base dan ms_puskesmas, yang semuanya belum di set/assign ke user dan group user manapun. Secara default jika kita tidak assign menu ke user/group manapun maka menu tersebut bisa diakses oleh semua user termasuk user Agus.
  2. User Agus sudah diset masuk ke group Employee (bawaan odoo) karena ketika create user pada bagian Application > Employees kita memilih Employee. Dan pada group Employee tersebut sudah diberikan akses ke menu Discuss sehingga muncul di user Agus.
  3. Selain akses ke menu Discuss di group Employee juga dapat akses ke beberapa object, diantaranya object res.partner yang kita pakai untuk form Dokter dan Pasien serta object product.template yang dipakai untuk form Obat
  4. Sehingga dapat disimpulkan bahwa jika user sudah mempunyai akses terhadap object dan menu yang berisi object tersebut maka menu yang bersangkutan akan muncul. Jadi jika user hanya memiliki akses terhadap salah satu maka menu tidak akan muncul. Misalnya user sudah mempunyai akses terhadap menu tapi tidak mempunyai akses terhadap object dalam menu tersebut maka menu tidak akan muncul. Ataupun sebaliknya, sudah dapat akses terhadap object tapi tidak terhadap menu maka menu tidak akan muncul.

Jadi jika ada pertanyaan kenapa menu Ruangan, Poli, Pendaftaran dan yang lainnya tidak muncul padahal menu tersebut belum di assign ke group dan user manapun? Ya jawabannya karena user Agus belum mempunyai akses ke object-object pada menu tersebut.

Berbeda dengan menu yang ketika pertama kali create dan belum di assign ke group manapun menu tersebut bisa diakses oleh semua user. Maka object ketika pertama kali dibuat dia tidak bisa diakses oleh user manapun (kecuali Administrator/superuser). Sehingga kalau anda perhatikan di terminal ada warning seperti ini

Memberitahu bahwa object-object tersebut tidak mempunyai access rules sehingga kita perlu menambahkannya. Dari beberapa object yang tidak mempunyai access rules di atas kita akan coba mempraktekkannya salah satu, yaitu ms.pendaftaran

Dengan menggunakan user Administrator dan Developer Mode nya aktif silahkan masuk ke menu Settings > Technical > Security > Access Controls List

Tambahkan record baru seperti ini

Menu tersebut fungsinya adalah untuk mengatur akses terhadap object. Dalam gambar di atas artinya kita akan menambahkan akses terhadap object ms.pendaftaran (Pendaftaran) dengan nama ms_pendaftaran read (nama bebas) dan akses yang diberikan hanya read. Kolom group dikosongkan sehingga setting akses tersebut berlaku untuk semua group/user. Jika group diisi maka hanya akan berlaku untuk group bersangkutan.

Kembali lagi ke user Agus dan silahkan reload browser. Maka akan bertambah satu menu baru yaitu Pendaftaran (tidak ada tombol create dan edit karena akses yang diberikan hanya read)

Untuk testing kita create beberapa record pada data master dan transaksi menggunakan user administrator. Silahkan ikuti video berikut

Sudah ada 3 record di menu Pendaftaran, selanjutnya buat user baru dengan nama Budi, settingan sama dengan user Agus.

Karena setting untuk kedua user tersebut sama maka menu-menu dan data yang muncul pun sama. Jika kita ingin membedakannya, misal Agus hanya bisa melihat data Pendaftaran yang poli tujuannya adalah Poli Gizi sementara Budi bisa melihat semua data Pendaftaran maka harus membuat group baru untuk kedua user tersebut. Menu nya terletak di Settings > Users > Groups

Buat group baru seperti di atas, isi hanya bagian Name dan tab Users. Dan buat satu lagi group Budi untuk user Budi

Sekarang kita sudah bisa membedakan akses bagi kedua user tersebut melalui setting group masing-masing. Tadi kita akan membuat Agus hanya bisa melihat data pendaftaran yang poli tujuannya adalah Poli Gizi sementara Budi bisa melihat semua data pendaftaran. Untuk melakukan itu silahkan masuk ke menu Settings > Technical > Security > Record Rules

Create record seperti berikut

Artinya kita membatasi data pada object ms.pendaftaran (Pendaftaran) untuk user yang masuk ke Group Agus hanya bisa mengakses data pendaftaran yang poli_id.kode=P001 (yaitu Poli Gizi).

User Budi tidak akan terkena pembatasan tersebut, karena tidak masuk ke Group Agus.

Pada bagian Group sebenarnya bisa dikosongkan, jika dikosongkan maka semua group akan terkena pembatasan tersebut (kecuali Administrator)

Jika ada pertanyaan, bagaimana jika satu object dan satu group memiliki lebih dari satu Record Rules? Maka itu boleh-boleh saja, pembatasan yang diterapkan merupakan kombinasi dari semuanya dengan menerapkan logic ‘|’ (atau). Misalnya ada dua pembatasan :

  1. Record Rule 1 isinya [(‘poli_id.kode’,’=’,’P001′)]
  2. Record Rule 2 [(‘poli_id.kode’,’=’,’P002′)]

Maka akan menampilkan data yang berisi kedua kode poli tersebut.

Namun jika ada case Record Rule yang dibuat otomatis oleh odoo namun kita tidak menginginkannya, maka kita bisa menonaktifkan Record Rules tersebut dengan men untick/uncheck field Active.

Kembali lagi ke testing, silahkan coba login lagi menggunakan user Agus dan Budi, masuk ke menu Pendaftaran maka akan terlihat perbedaannya.

Case selanjutnya kita akan set menu Obat hanya bisa diakses oleh Budi, maka caranya adalah edit group Budi dan pada tab Menu tambahkan menu Obat

Jika menu sudah ditambahkan di salah satu group maka menu itupun tidak lagi bisa diakses oleh semua group. Tapi hanya bisa diakses oleh group tertentu yang di dalamnya terdapat menu Obat tersebut. Dan menu Obat pun hilang dari user Agus. Tapi menu Obat ini tidak hanya bisa muncul di group Budi, jika ada group lain yang perlu memunculkan menu tersebut maka bisa ditambahkan juga.

Kalau sebelumnya Agus dan Budi sama-sama hanya mempunyai akses read terhadap data ms.pendaftaran, maka sekarang kita akan ubah Budi bisa melakukan proses CRUD. Caranya masih di group Budi edit dan tambahkan pada tab Access Right seperti berikut

Maka akan muncul tombol create dan edit di user Budi

Oke kita sudah berhasil mengatur akses terhadap object, menu dan spesifik data. Lalu bagaimana caranya untuk mengatur akses terhadap fields dan button? Berbeda dengan beberapa hal yang sudah kita lakukan sebelumnya yang bisa disetting melalui aplikasi, maka untuk mengatur akses fields dan button kita harus menambahkannya lewat coding. Yaitu dengan menambahkan attribute groups=”nama_addons.external_id_groups” dan group yang di assign di fields/button tersebut pun harus dibuat melalui coding karena harus membaca External ID

Sekarang tambahkan folder baru di addons ms_puskesmas yaitu ‘data’ dan file baru di dalamnya res_groups.xml. Isi dengan syntax berikut

<odoo>
    <data noupdate="0">
 
        <record id="group_visible" model="res.groups">
            <field name="name">Visible Button</field>
        </record>
 
    </data>
</odoo>

Kemudian edit button confirm, cancel dan field pasien_id di ms_puskesmas/views/ms_pendaftaran.xml dengan menambahkan attribute  groups=”ms_puskesmas.group_visible” seperti

<button name="action_confirm" string="Confirm" type="object" class="oe_highlight" attrs="{'invisible': [('state','!=','draft')]}" groups="ms_puskesmas.group_visible"/>

Jangan lupa tambahkan baris “data/res_groups.xml” di __manifest__.py, restart service dan upgrade.

Note : baris “data/res_groups.xml” harus terletak sebelum “views/ms_pendaftaran.xml” karena di “views/ms_pendaftaran.xml” membaca External ID di res_groups.xml. Jika tidak maka akan error karena External ID group dibaca sebelum record group tersebut masuk ke database.

Setelah upgrade modul maka button dan fields pasien_id hilang dari kedua user. Kemudian kita akan mengatur agar button Confirm, Cancel dan fields pasien_id hanya muncul di user Budi.

Agar ketiganya muncul kembali di user Budi maka ada dua cara :

  1. User Budi dimasukkan ke group Visible Button, atau
  2. Group Budi meng inherit Group Visible Button (edit group Budi dan pada tab Inherited tambahkan group Visible Button). Inherited ini artinya semua akses yang ada di group yang diinherit maka otomatis akan ditambahkan juga di group yang menginheritnya

Sehingga button dan field pasien_id akan muncul di user Budi

Saya rasa sudah cukup pembahasan mengenai hak akses ini. Tadi kita mempraktekannya dengan menambahkan langsung di aplikasi. Namun biasanya pembuatan hak akses ini lebih sering dilakukan melalui coding. Groups dan Record Rule ditambahkan melalui xml dan Access Control List melalui csv. Tapi kalau anda sudah memahami konsepnya maka tidak akan sulit untuk membuatnya lewat coding.

Note : Tutorial ini menggunakan Odoo 10

Terimakasih, semoga bermanfaat dan CMIIW…

Tutorial odoo/openerp Indonesia