Di artikel sebelumnya saya telah menjelaskan bagaimana caranya membuat custom role pada windows application yang pada akhirnya role tersebut di mapping ke menustrip control untuk membatasi hak akses user pada menu tertentu. Lalu bagaimana caranya kalau kita ingin membatasi hak akses user sampai ke control button yang ada pada form? Misalnya untuk role operator hanya bisa menggunakan button simpan dan batal tanpa bisa menggunakan button update dan delete, sebaliknya untuk role admin bisa melakukan semuanya.
Kasus ini saya dapatkan ketika saya mengerjakan sebuah project dimana user requirementnya ingin agar aplikasi tersebut bisa membatasi hak akses sampai ke button yang ada pada form. Awalnya saya sempat bingung bagaimana caranya...sampai pada akhirnya terpikir untuk menggunakan System.Reflection namespace. Namespace tersebut digunakan untuk mendapatkan informasi form-form apa saja yang terdapat di dalam project tersebut. Kemudian setelah mendapatkan informasi tersebut kita dapat melakukan instantiasi form secara runtime dari type yang didapat untuk mendapatkan button-button yang terdapat didalam form tersebut.
Mengenai code nya saya tidak akan bahas karena cukup panjang :) anda bisa download saja source code nya. Disini saya akan terangkan garis besarnya saja.
Pertama, buat tabel dengan relasi seperti gambar dibawah ini :
Tabel RoleDetails berisi data rinci tentang hak akses untuk role tertentu. Biar lebih jelas kita lihat contoh record tabel RoleDetails seperti gambar dibawah ini :
Kolom MenuName di tabel RoleDetails berisi nama nama menu yang diambil dari property Tag MenuStrip di Form Parent beserta nama-nama button pada form yang diambil dari property Text button control. Kenapa saya menggunakan property Tag di MenuStrip? Kenapa ga diambil dari property Text saja? Penggunaan property Tag sebagai solusi kalau MenuStrip yang digunakan berisi teks yang dapat diakses sebagai shortcut key (with ampersand symbol). Jadi kita tidak ingin menampilkan menu yang memiliki simbol tersebut, oleh karena itu saya gunakan property Tag.
Kolom FormAction berisi data-data berupa nama-nama Form yang memberikan petunjuk dimana letak button-button yang ada di kolom MenuName berada.
Kolom Tag berisi data yang menunjukkan apakah MenuStrip yang terdapat di kolom MenuName tersebut berupa menu header (tag:="menu") atau menu yang memanggil form (tag:="menuform"), atau hanya berupa button yang terdapat didalam form (tag:="action"). Tag "menu" dan tag "menuform" diambil dari property AccessibleName MenuStrip yang bersangkutan. Jadi kita harus memberikan value ke property AccessibleName untuk memberitahukan apakah menu tersebut hanya berupa header menu (tag:="menu") atau menu yang akan memanggil form (tag:="menuform"). Sedangkan tag "action" di set secara runtime untuk menunjukkan bahwa tag tersebut berupa control button.
Ada syarat yang saya gunakan untuk pemberian property Tag pada MenuStrip, yaitu untuk MenuStrip yang akan memanggil sebuah form, value yang digunakan pada property Tag yaitu berupa nama form yang akan dipanggil. Hal ini digunakan untuk create instance secara runtime dengan menggunakan Reflection yang akan mapping control button yang terdapat didalamnya. Property Tag dari Form juga harus diset dengan nama form yang bersangkutan.
Sekarang mari kita lihat contoh record yang terdapat didalam tabel FormActions pada gambar dibawah ini :
Kolom FormName yang terdapat di tabel FormActions berisi data mengenai nama-nama form yang terdapat di dalam aplikasi tersebut. Kolom Act1, Act2, ...Actn merupakan kolom yang berisi data mengenai nama-nama control button yang terdapat di dalam form tersebut. Kolom Actn diambil dari property Text button. Data data yang terdapat di tabel RoleDetails dan tabel FormActions ini digunakan untuk mapping ke control TreeView. Secara default saya tambahkan data pada kelima tabel diatas untuk role Adm1 ketika program pertama kali dijalankan. Anda tinggal buat form yang digunakan untuk manage user, role, dan employees.
Code untuk aplikasi ini butuh sedikit teknik yang harus dilakukan di form login (Load event) untuk menjaga Data Integrity yaitu dengan menggunakan Transaction. Disini saya tidak menggunakan Transaction karena waktu itu dikejar deadline project :) Anda bisa improve code yang digunakan...hasil akhirnya akan tampak seperti gambar dibawah ini :
Info: Ebook-ebook yang tersedia yang dapat dipesan secara langsung atau melalui google play store.