CodeIgniter - BloACL

Ditulis pada tanggal 07 Januari 2011

[Bloon] Aktifitas baru di tahun baru: back to code. Walau masih berkutat dengan PHP (lagi lagi dan lagi), kali ini ada sedikit beda di pola pengembangannya, sekarang pakai CodeIgniter. Sebenernya bukan pertama kali ini aku pakai CI. Beberapa bulan yang lalu sempet juga bikin dua aplikasi pakai CI, tapi memang cukup serampangan. Sedikit sabar baca user guide bawaan CI, hasilnya lumayan juga, sudah bisa mulai merasa nyaman. Fungsi-fungsi yang selama ini kupunya bisa dipakai dengan dijadikan helper. Core Controller Class-nya bisa di-extend, memudahkan bikin tambahan fungsi yang perlu dipanggil oleh banyak controller.

Yang ndak seberapa menyenangkan, ternyata CI ndak punya pustaka ACL. Ada implementasi ACL dari framework lain yang bisa dipakai di dalam CI seperti ZendACL. Ada juga beberapa library bebas yang bisa dipakai, tapi di situ ada juga urusan pengaturan user, dsb. Yang aku perlu *murni* urusan ACL. Ya memang agak aneh juga sih kalau ada library ACL yang ndak pakai urusan manajemen user, tapi aku lebih suka yang kosongan karena boleh jadi daftar userku ndak ada di database yang dipakai CI, misalnya pakai database LDAP yang ada di server lain yang sudah jadi.

Aplikasiku ini ceritanya membedakan pengguna berdasarkan 3 kategori yaitu mbaurekso, tukang tulis, dan tukang komentar. Terserah gimana caranya, ketika orang login, ada 2 session yang terdaftar yaitu id_user dan grup_user. Dari sini akhirnya aku bikin sendiri implementasi ACL yang pemeriksaannya dilakukan berdasarkan grup_user. Pemeriksaannya pakai array yang menyebutkan mana saja controller dan method yang boleh diakses oleh masing-masing kategori pengguna. Kalau di array itu ndak terdefinisi, berarti dia ndak boleh akses. Bentuk umumnya lebih kurang begini:

  1. $config['bloacl'][1]['atur']['tambahorang'] = 1;
  2. $config['bloacl'][2]['posts']['lihatpost'] = 1;
  3. $config['bloacl'][3]['posts']['hapusAttach'] = 1

Dengan konfig seperti di atas, pengguna kategori 1 bisa mengakses atur/tambahorang, kategori 2 bisa mengakses posts/lihatpost, dan kategori 3 bisa mengakses posts/hapusAttach. Kemudian ada juga controller yang bisa diakses oleh siapa pun, misalnya orang-orang yang belum login. Di sini aku pakai angka nol (0) sebagai pangkat orang-orang sejenis itu. Bentuknya persis seperti yang di atas yaitu:
  1. $config['bloonacl'][0]['gaboleh']['index'] = 1;

Konfig itu ditaruh di direktori application/config yang bakal di-load ketika library acl diaktifkan. Eh iya, entah kenapa aku kok cukup sreg ngasih nama librari ini "bloacl" (bacalah: a ce el blo'on).

Class untuk komponen ditaruh di application/libraries. Pemeriksaan hak akses dilakukan di fungsi cek_akes(). Isi filenya begini:
  1. Class Bloacl {
  2.   private $ci;
  3.   private $class;
  4.   private $method;
  5.   private $usertype;
  6.   private $hakAkses = array();
  7.  
  8.   function __construct( $params ) {
  9.     $this->ci = &get_instance();
  10.     $this->ci->config->load('bloacl');
  11.     $this->hakAkses = $this->ci->config->item( 'bloacl' );
  12.     $this->routes = &load_class( 'Router' );
  13.    
  14.     $this->init( $params['priv'] );
  15.   }
  16.  
  17.   function init( $priv ) {
  18.     if( ! $priv ) $priv = '0';
  19.     $this->usertype = $priv;
  20.     $this->class = $this->ci->router->fetch_class();
  21.     $this->method = $this->ci->router->fetch_method();
  22.     $this->cek_akses();
  23.   }
  24.  
  25.   function cek_akses() {
  26.     // cek akses bebas dulu (boleh diakses semua orang)
  27.     if( ! empty( $this->hakAkses[0][$this->class][$this->method] ) )
  28.       return true;
  29.  
  30.     // cek akses untuk yang ndak bebas;
  31.     if( ! empty( $this->hakAkses[$this->usertype][$this->class][$this->method] ) ) {
  32.       return true;
  33.     } else {
  34.       redirect( 'gaboleh' );
  35.     }
  36.   }
  37. }
  38.  

Seperti yang udah kutulis di atas, aku pakai class controllerku sendiri, extend dari class controller bawaan CI, jadi aktifasi pemeriksaannya kulakukan di constructor class itu. Penampakan kodenya (yang relevan aja) lebih kurang seperti ini:
  1. Class SController extends Controller {
  2.   function __construct() {
  3.     $this->load->library( 'bloacl',
  4.         array( 'priv' => $this->session->userdata( 'role_id' ) ) );
  5.   }
  6. }

Sementara ini dengan kerangka seperti itu rasanya kebutuhanku sudah terpenuhi. Beberapa hal yang kusuka dari cara ini adalah:
  1. Pengaturan hak akses dilakukan secara terpusat, ndak nyebar di banyak controller/method.
  2. Bentuknya cukup umum, gampang dimodifikasi sesuai kebutuhan.
  3. Data user ndak harus berada di database yang sama dengan db aplikasi.
  4. Designed with blo'on in mind , makenya gampang (nek ke-blo'on-en yo sik tetep susah sih :P)

Implementasi semacam ini memungkinkan untuk dilakukan khususnya untuk pembangunan aplikasi-aplikasi kecil. Kalau punya buanyak controller yang ukurannya segede gajah, rasanya ya susah kalau musti ngetik hak aksesnya satu-persatu ke variabel array. Akan lebih mudah kalau pengaturan hak aksesnya dilakukan di database dengan pengaturan berbasis web. Kodenya mana? Ya ndak ada, lha wong aku memang ndak bikin. Kalau sampeyan mau bikin ya monggo :P

Untuk pembuatan aplikasi yang ndak pakai custom controller seperti yang kutulis di sini, mestinya memindahkan proses aktifasinya ke Hooks juga ndak sulit. Tinggal dijalankan di bagian pre_controller dan ubah sedikit kode di atas rasanya ndak susah juga, yang penting kreatip dan sabar. Omong-omong, kalau ada yang nyoba potongan kode itu dan ternyata nemu bug, aku dikasih tau ya he..he..he.. :D

 

 

Timpalan tulisan

Tomy - 8 Nov 2011

ajari yo :D

 

Timpali tulisan

Nama
Komentar
  [Kode Huruf] Ndak bisa dibaca? klik di sini.
  Tuliskan kode di atas di isian ini:
Seharusnya situs ini kelihatan bagus kalo anda lihat menggunakan layar monitor
Kalau dilihat dari kuku jempol... Ah... Dunia khayal...

Ha? Apa? XHTML? Halah prek! Gelem wacanen, ndak gelem tinggalen :P