Tutorial Codeigniter Part 10 – Membatasi Akses User

codeigniter-kcdev
Advertisements

Sebelumnya kita telah berhasil membuat modul login dan melakukan proses CRUD pada codeigniter. Akan tetapi pada saat kita login baik sebagai administrator maupun sebagai alumni, kita tetap bisa melihat menu users pada sidebar di sebelah kiri dan melakukan penambahan data pada tabel users. Tujuan utama kita adalah hanya administrator yang bisa melihat menu users dan menambah datanya sedangkan alumni hanya bisa menambah data events dan lowongan kerja yang akan kita buat nanti. Jadi pada tutorial ini kita akan membatasi akses user pada menu atau modul tertentu.

1. Membuat Fungsi Cek Level User Pada Core Controller

Buka file application/core/MY_Controller.php kemudian update kode di dalamnya sehingga core controller kita akan terlihat seperti di bawah.

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class MY_Controller extends CI_Controller 
{
  public function cekLogin()
  {
    // Jika belum ada session username maka 
    // redirect ke halaman auth/login
    if (!$this->session->userdata('username')) {
      redirect('auth/login');
    }
  }
  
  public function getUserData()
  {
    // Ambil semua data session
    $userData = $this->session->userdata();

    // Return userdata
    return $userData;
  }

  public function isAdmin()
  {
    // Mengambil data session
    $userData = $this->getUserData();

    // Jika level user bukan administrator
    // maka redirect ke halaman 404
    if ($userData['level'] !== 'administrator') show_404();
  }

}

Dari kode di atas, kita menambahkan 2 function baru yang bertugas sebagai:

  • getUserData, untuk mengambil data user yang berada di session. $this->session->userdata() adalah library codeigniter yang pada dasarnya sama dengan $_SESSION pada native php.
  • isAdmin, tugas utama fungsi ini adalah untuk memeriksa apakah user yang sedang login merupakan administrator atau bukan. Jika bukan maka redirect user ke halaman 404.

2. Mengupdate Controller Users

Pada controller users kita akan memanggil fungsi isAdmin pada bagian constructor nya. Jadi setiap kali controller users ini dipanggil, maka level user yang sedang login akan langsung diperksa.

<?php defined('BASEPATH') OR exit('No direct script access allowed');

class Users extends MY_Controller {

  public function __construct()
  {
    parent::__construct();
    
    // Cek apakah user sudah login
    $this->cekLogin();

    // Cek apakah user login 
    // sebagai administrator
    $this->isAdmin();

    // Load model users
    $this->load->model('model_users');
  }

  public function index()
  {
    // Data untuk page index
    $data['pageTitle'] = 'Users';
    $data['users'] = $this->model_users->get()->result();
    $data['pageContent'] = $this->load->view('users/userList', $data, TRUE);

    // Jalankan view template/layout
    $this->load->view('template/layout', $data);
  }

  public function add()
  {
    // Jika form di submit jalankan blok kode ini
    if ($this->input->post('submit')) {
      
      // Mengatur validasi data username,
      // # required = tidak boleh kosong
      // # min_length[5] = username harus terdiri dari minimal 5 karakter
      // # is_unique[users.username] = username harus bernilai unique, 
      //   tidak boleh sama dengan record yg sudah ada pada tabel users
      $this->form_validation->set_rules('username', 'Username', 'required|min_length[5]|is_unique[users.username]');

      // Mengatur validasi data password,
      // # required = tidak boleh kosong
      // # min_length[5] = password harus terdiri dari minimal 5 karakter
      $this->form_validation->set_rules('password', 'Password', 'required|min_length[5]');

      // Mengatur validasi data level,
      // # required = tidak boleh kosong
      // # in_list[administrator, alumni] = hanya boleh bernilai 
      //   salah satu di antara administrator atau alumni
      $this->form_validation->set_rules('level', 'Level', 'required|in_list[administrator,alumni]');

      // Mengatur validasi data active,
      // # required = tidak boleh kosong
      // # in_list[0, 1] = hanya boleh bernilai 
      // salah satu di antara 0 atau 1
      $this->form_validation->set_rules('active', 'Active', 'required|in_list[0,1]');

      // Mengatur pesan error validasi data
      $this->form_validation->set_message('required', '%s tidak boleh kosong!');
      $this->form_validation->set_message('min_length', '%s minimal %d karakter!');

      // Jalankan validasi jika semuanya benar maka lanjutkan
      if ($this->form_validation->run() === TRUE) {

        $data = array(
          'username' => $this->input->post('username'),
          'password' => password_hash($this->input->post('password'), PASSWORD_DEFAULT),
          'level' => $this->input->post('level'),
          'active' => $this->input->post('active')
        );

        // Jalankan function insert pada model_users
        $query = $this->model_users->insert($data);

        // cek jika query berhasil
        if ($query) $message = array('status' => true, 'message' => 'Berhasil menambahkan user');
        else $message = array('status' => true, 'message' => 'Gagal menambahkan user');

        // simpan message sebagai session
        $this->session->set_flashdata('message', $message);

        // refresh page
        redirect('users/add', 'refresh');
			} 
    }
    
    // Data untuk page users/add
    $data['pageTitle'] = 'Tambah Data User';
    $data['pageContent'] = $this->load->view('users/userAdd', $data, TRUE);

    // Jalankan view template/layout
    $this->load->view('template/layout', $data);
  }

  public function edit($id = null)
  {
    // Jika form di submit jalankan blok kode ini
    if ($this->input->post('submit')) {
      
      // Mengatur validasi data password,
      // # required = tidak boleh kosong
      // # min_length[5] = password harus terdiri dari minimal 5 karakter
      $this->form_validation->set_rules('password', 'Password', 'required|min_length[5]');

      // Mengatur validasi data level,
      // # required = tidak boleh kosong
      // # in_list[administrator, alumni] = hanya boleh bernilai 
      //   salah satu di antara administrator atau alumni
      $this->form_validation->set_rules('level', 'Level', 'required|in_list[administrator,alumni]');

      // Mengatur validasi data active,
      // # required = tidak boleh kosong
      // # in_list[0, 1] = hanya boleh bernilai 
      // salah satu di antara 0 atau 1
      $this->form_validation->set_rules('active', 'Active', 'required|in_list[0,1]');

      // Mengatur pesan error validasi data
      $this->form_validation->set_message('required', '%s tidak boleh kosong!');
      $this->form_validation->set_message('min_length', '%s minimal %d karakter!');

      // Jalankan validasi jika semuanya benar maka lanjutkan
      if ($this->form_validation->run() === TRUE) {

        $data = array(
          'password' => password_hash($this->input->post('password'), PASSWORD_DEFAULT),
          'level' => $this->input->post('level'),
          'active' => $this->input->post('active')
        );

        // Jalankan function insert pada model_users
        $query = $this->model_users->update($id, $data);

        // cek jika query berhasil
        if ($query) $message = array('status' => true, 'message' => 'Berhasil memperbarui user');
        else $message = array('status' => true, 'message' => 'Gagal memperbarui user');

        // simpan message sebagai session
        $this->session->set_flashdata('message', $message);

        // refresh page
        redirect('users/edit/'.$id, 'refresh');
			} 
    }
    
    // Ambil data user dari database
    $user = $this->model_users->get_where(array('id' => $id))->row();

    // Jika data user tidak ada maka show 404
    if (!$user) show_404();

    // Data untuk page users/add
    $data['pageTitle'] = 'Edit Data User';
    $data['user'] = $user;
    $data['pageContent'] = $this->load->view('users/userEdit', $data, TRUE);

    // Jalankan view template/layout
    $this->load->view('template/layout', $data);
  }

  public function delete($id)
  {
    // Ambil data user dari database
    $user = $this->model_users->get_where(array('id' => $id))->row();

    // Jika data user tidak ada maka show 404
    if (!$user) show_404();

    // Jalankan function delete pada model_users
    $query = $this->model_users->delete($id);

    // cek jika query berhasil
    if ($query) $message = array('status' => true, 'message' => 'Berhasil menghapus user');
    else $message = array('status' => true, 'message' => 'Gagal menghapus user');

    // simpan message sebagai session
    $this->session->set_flashdata('message', $message);

    // refresh page
    redirect('users', 'refresh');
  }
}

3. Mengupdate Template Sidebar

Advertisements

Tugas terakhir kita pada tutorial ini adalah, memperbarui template sidebar kita agar menu users hanya ditampilkan jika user yang telah login adalah seorang administrator. File application/views/template/sidebar.php akan berisi kode berikut:

<aside>
  <ul id="sidenav" class="side-nav fixed">
    
    <li>
      <div class="userView">
        <div class="background">
          <img src="<?php echo base_url('assets/images/nav6.jpg'); ?>">
        </div>
        <a href="#!user"><img class="circle" src="<?php echo base_url('assets/images/noavatar.png'); ?>"></a>
        <a href="#!name"><span class="white-text name"><?php echo ucwords(strtolower($this->session->userdata('username'))); ?></span></a>
        <a href="#!email"><span class="white-text email"><?php echo ucwords(strtolower($this->session->userdata('level'))); ?></span></a>
      </div>
    </li>

    <li>
      <a class="waves-effect" href="<?php echo base_url('dashboard'); ?>"><i class="material-icons">home</i>Dashboard</a>
    </li>
    
    <li>
      <div class="divider"></div>
    </li>

    <?php if($this->session->userdata('level') === 'administrator'): ?>
      <li>
        <a class="subheader">Admin</a>
      </li>
      
      <li>
        <a class="waves-effect" href="<?php echo base_url('users'); ?>"><i class="material-icons">people</i>Users</a>
      </li>
      
      <li>
        <div class="divider"></div>
      </li>
    <?php endif; ?>

    <li>
      <a class="waves-effect"  href="<?php echo base_url('auth/logout'); ?>"><i class="material-icons">exit_to_app</i>Logout</a>
    </li>
    
  </ul>
</aside>

4. Testing

Untuk melakukan testing apakah pekerjaan kita berhasil, silahkan login menggunakan akun alumni. Setelah berhasil login maka menu users pada sidebar tidak akan muncul. Begitu juga jika kita memasukkan url http://localhost/codeigniter/users secara manual pada address bar maka akan ditampilkan halaman 404 Not Found.

File yang digunakan pada tutorial ini bisa di dapatkan di github saya. Semoga bermanfaat bagi adiks sekalian. Terima kasih.

Advertisements

Salam Codeigniter,

kaceManaf

Author: kaceManaf

Founders of kcdev.id, freelance full stack web developer and also a web-tech wanderer. Passionate about code readability and simplicity. https://www.linkedin.com/in/nafplann/

3 Replies to “Tutorial Codeigniter Part 10 – Membatasi Akses User

  1. gan mau nanya, kalau misalkan saya login sebagai admin, dan saya bisa edit dan hapus bagian lokernya, bagaimana ya, ini kan bisa edit dan hapus by username aja, sedangkan admin aja gak bisa punya akses edit dan delete kalau misal user lain (selain admin) yang create.

    1. ditambahkan saja kondisi lain bro di bagian logicnya. misalnya:
      if ($loker->username !== $this->session->userdata(‘username’) || $this->session->userdata(‘level’) === ‘administrator) show_404();

  2. Thank you for your source code min. Kalo seandainya ada 3 hak akses untuk admin-user-dan investor gimana cara nya agar si investor itu bisa lihat data2 dari si user juga? Mohon informasi nya ya min Thanks

Leave a Reply

Your email address will not be published. Required fields are marked *