Membuat Hak Akses User bagian 2

Pada artikel lanjutan ini, kita akan membuat akses menu dan memperbaiki beberapa bagian pada sistem login dari proyek-web, seperti pengecekan user sudah login atau belum dan menambahkan halaman block jika ada user yang role user-nya member tetapi berusaha membuka halaman yang role user-nya hanya dapat diakses oleh admin. Terakhir, kita juga akan mengupdate view menu, supaya menu yang ditampilkan pada aplikasi menyesuaikan dengan role user. Silahkan dibaca dengan jeli setiap bagian dari pembahasan kali ini.

Menambahkan Modal Akses Menu

Akses menu dibuat untuk memberikan akses user sesuai dengan role, misalnya admin dapat mengakses halaman setting dan profile, sedangkan member hanya mengakses halaman profil saja, kurang lebih seperti itu.

Membuat Helper

Untuk membuat helper kita dapat menambahkan langsung pada folder Helpers, misalkan kita buat nama filenya proto_helper.php, lalu kita isi dengan sintak berikut:

php
<?php function cek_akses($id_role, $id_menu) { $db = \Config\Database::connect(); $aksesmenu = $db->table('aksesmenu'); //loading query aksesmenu $aksesmenu->where('id_role', $id_role); $aksesmenu->where('id_menu', $id_menu); $query = $aksesmenu->countAllResults(); if ($query > 0) { return "checked='checked'"; } }

Menambahkan pada file BaseController

Setelah file helper proto_helper.php tersimpan, saatnya kita menambahkan ke BaseController.php yang terdapat di dalam folder Controllers, silahkan tambahkan pada baris 38, dengan helper yang telah kita buat yaitu proto:

php
/** * An array of helpers to be loaded automatically upon * class instantiation. These helpers will be available * to all other controllers that extend BaseController. * * @var array */ protected $helpers = ['form', 'url', 'auth', 'proto'];

Mengubah controller Role

Kita akan menambah fungsi yang mengatur akses menu ini dan menambahkan tombol ikon untuk merubah akses di controller Role.php, silahkan tambahkan tombol ubah akses di dalam fungsi ajax_list() dan fungsi editakses() dan updateakses() setelah fungsi updatedata()

Potongan baris kode Role.php
php
.... public function ajax_list() { $request = Services::request(); $m_data = new Modelrole($request); if ($request->getPost()) { $lists = $m_data->get_datatables(); $data = []; $no = $request->getPost("start"); foreach ($lists as $list) { $no++; $row = []; //tombol edit $tomboledit = "<button type=\"button\" title=\"Edit Data\" class=\"btn btn-info btn-sm\" onclick=\"edit('" . $list->id_role . "')\"> <i class=\"fa fa-tasks\"></i></button>"; //tombol akses $tombolakses = "<button type=\"button\" title=\"Akses Menu\" class=\"btn btn-warning btn-sm\" onclick=\"akses('" . $list->id_role . "')\"> <i class=\"fa fa-cogs\"></i></button>"; $row[] = $no; $row[] = $list->role; $row[] = $tomboledit . " " . $tombolakses; $data[] = $row; } .... .... //edit data akses public function editakses() { if ($this->request->isAJAX()) { $id_role = $this->request->getVar('id_role'); // role $role = new Modelrole($this->request); $data['role'] = $role->find($id_role); //data2 menu $menu = new Modelmenu($this->request); $data['menu'] = $menu->findAll(); $msg = [ 'sukses' => view('role/modalakses', $data) ]; echo json_encode($msg); } else { exit('Maaf, tidak dapat diproses'); } } //update akses public function updateakses() { if ($this->request->isAJAX()) { //akses database $db = \Config\Database::connect(); $aksesmenu = $db->table('aksesmenu'); $id_role = $this->request->getVar('id_role'); $id_menu = $this->request->getVar('id_menu'); $data = [ 'id_role' => $id_role, 'id_menu' => $id_menu ]; $aksesmenu->where($data); $result = $aksesmenu->countAllResults(); if ($result < 1) { $aksesmenu->insert($data); } else { $aksesmenu->where($data); $aksesmenu->delete(); } $msg = [ 'sukses' => 'Akses menu telah diubah' ]; echo json_encode($msg); } else { exit('Maaf, tidak dapat diproses'); } } ....

Membuat view

Menambahkan modal akses

Selanjutnya kita akan menambahkan sebuah tampilan modal untuk menambahkan akses menu berdasarkan role, misalnya kita beri nama modalakses.php, kita simpan pada folder Views/role/, seperti pada gambar berikut:

Silahkan salin baris kode berikut ke dalam file modalakses.php

php-template
<!-- Modal --> <div class="modal fade" id="modalakses" tabindex="-1" aria-labelledby="modalaksesLabel" aria-hidden="true"> <div class="modal-dialog modal-md"> <div class="modal-content"> <div class="modal-header bg-danger text-white"> <h5 class="modal-title" id="modalaksesLabel">Role Akses <?= $role['role']; ?></h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div> <?= form_open('role/updateakses', ['class' => 'formakses']); ?> <?= csrf_field(); ?> <div class="modal-body"> <input type="text" class="form-control" id="id_role" name="id_role" value="<?= $role['id_role']; ?>" hidden> <table class="table table-hover"> <thead class="bg-dark text-white"> <tr> <th scope="col">No</th> <th scope="col">Menu</th> <th scope="col">Akses</th> </tr> </thead> <tbody> <?php $i = 1; ?> <?php foreach ($menu as $m) : ?> <tr> <th scope="row"><?= $i; ?></th> <td><?= $m['menu']; ?></td> <td> <div class="form-check"> <input class="form-check-input" type="checkbox" <?= cek_akses($role['id_role'], $m['id_menu']); ?> data-role="<?= $role['id_role']; ?>" data-menu="<?= $m['id_menu']; ?>"> </div> </td> </tr> <?php $i++; ?> <?php endforeach; ?> </tbody> </table> <div class="modal-footer"> <button type="button" class="btn btn-secondary btn-close" data-dismiss="modal">Tutup</button> </div> <?= form_close(); ?> </div> </div> </div> <!--Menu Akses--> <script> $(document).ready(function() { $('.form-check-input').on('click', function() { const id_menu = $(this).data('menu'); const id_role = $(this).data('role'); $.ajax({ url: "<?= base_url('role/updateakses'); ?>", type: 'post', data: { id_menu: id_menu, id_role: id_role }, dataType: "json", success: function(response) { //pesan sukses bro Swal.fire({ icon: 'success', title: 'Berhasil', text: response.sukses }); //hide modal akses $('#modalakses').modal('hide'); $('.modal-backdrop').hide(); akses(id_role); }, error: function(xhr, ajaxOptions, thrownError) { alert(xhr.status + "\n" + xhr.responseText + "\n" + thrownError); } }); return false; }); }); </script> <!--Menu Akses End-->

Membuat Filter Cek Login

Selanjutnya kita akan membuat file filter untuk mengatur hak aksesnya, misalnya kita beri nama filenya Ceklogin.php, silahkan ketikan perintah berikut melalui terminal atau CMD, seperti berikut ini:

cli
php spark make:filter ceklogin

Lalu kita akan menambahkan aturan tersebut pada fungsi public function before(RequestInterface $request, $arguments = null), pada baris 26. perhatikan potongan kode berikut:

Potongan baris kode Ceklogin.php
php
public function before(RequestInterface $request, $arguments = null) { //cek login, jika tidak ada sesi akan diarahkan ke halaman /login $uri = new \CodeIgniter\HTTP\URI(); $host = site_url(); $uri = service('uri', $host); //akses database $db = \Config\Database::connect(); // Do something here if (!session('login')) { return redirect()->to('/login'); } else { $id_role = session()->get('id_role'); $menu = $uri->getSegment(1); $query_cekuser = $db->query("SELECT menu.id_menu FROM menu JOIN submenu WHERE menu.id_menu=submenu.id_menu AND submenu.link='$menu'"); $id_menu = $query_cekuser->getRow('id_menu'); $query_akses = $db->query("SELECT * FROM aksesmenu WHERE id_role='$id_role' AND id_menu='$id_menu'"); $query = $query_akses->getNumRows(); if ($query < 1) { return redirect()->to('login/block'); } } }

Mengisi akses menu

Silahkan sesuaikan seperti pada gambar berikut:

Role Admin

Role Member

Menambahkan pada File Filters.php

Setelah file Ceklogin.php disimpan, kita akan menambahkan pada file Filters.php yang terdapat pada folder Config, seperti pada kode berikut, sesuaikan dengan sintak yang berlatar kuning, tambahkan sesuai Controller yang sudah kita buat sebelumnya, jadi setiap kali menambah controller maka kita harus menambahkan controller baru untuk didaftarkan pada file Filters.php ini.

Baris kode Filters.php
php
<?php namespace Config; use CodeIgniter\Config\BaseConfig; use CodeIgniter\Filters\CSRF; use CodeIgniter\Filters\DebugToolbar; use CodeIgniter\Filters\Honeypot; use CodeIgniter\Filters\InvalidChars; use CodeIgniter\Filters\SecureHeaders; use App\Filters\Ceklogin; class Filters extends BaseConfig { /** * Configures aliases for Filter classes to * make reading things nicer and simpler. * * @var array<string, class-string|list<class-string>> [filter_name => classname] * or [filter_name => [classname1, classname2, ...]] */ public array $aliases = [ 'csrf' => CSRF::class, 'toolbar' => DebugToolbar::class, 'honeypot' => Honeypot::class, 'invalidchars' => InvalidChars::class, 'secureheaders' => SecureHeaders::class, 'ceklogin' => Ceklogin::class, ]; /** * List of filter aliases that are always * applied before and after every request. * * @var array<string, array<string, array<string, string>>>|array<string, list<string>> */ public array $globals = [ 'before' => [ // 'honeypot', // 'csrf', // 'invalidchars', ], 'after' => [ 'toolbar', // 'honeypot', // 'secureheaders', ], ]; /** * List of filter aliases that works on a * particular HTTP method (GET, POST, etc.). * * Example: * 'post' => ['foo', 'bar'] * * If you use this, you should disable auto-routing because auto-routing * permits any HTTP method to access a controller. Accessing the controller * with a method you don't expect could bypass the filter. */ public array $methods = []; /** * List of filter aliases that should run on any * before or after URI patterns. * * Example: * 'isLoggedIn' => ['before' => ['account/*', 'profiles/*']] */ public array $filters = [ 'ceklogin' => [ 'before' => [ 'dashboard', 'profile', 'user', 'menu', 'submenu', 'role' ] ] ]; }

Edit Controller Login

Tambah cek sesi

Kita akan menambahkan kode tambahkan di Controller Login pada fungsi index(), sebuah percabangan yang mengecek sebuah sesi sudah login atau belum, berdasarkan email, jika ada email pada sesi atau sudah login, maka user tidak perlu login lagi, tetapi diarahkan pada halaman profile. perhatikan baris kode berikut:

Potongan baris kode Login.php
php
.... public function index() { // jika sudah login if (session('email')) { return redirect()->to('/profile'); } // return view('template/login'); $data['judul'] = "Halaman Login"; return view('login/index', $data); } ....

Tambah fungsi Block dan view block

Fungsi Block

Masih pada Controller Login, kita akan menambahkan fungsi block, untuk memberikan informasi bahwa halaman tersebut tidak dapat diakses, silahkan tambahkan fungsi tersebut sebelum fungsi keluar():

Potongan baris kode Login.php
php
public function block() { // return view('template/login'); $data['judul'] = "Halaman Terbatas"; return view('login/block', $data); }

View block

Silahkan buat file block.php pada Views/login/, lalu isi dengan kode berikut:

Baris kode block.php
html
<?= $this->extend('template/main'); ?> <?= $this->extend('template/menu'); ?> <?= $this->section('konten'); ?> <div class="text-center"> <img src="<?= base_url() ?>/assets/img/innovation.svg" style="max-height: 90px"> <h4 class="pt-3">Maaf, halaman ini tidak dapat diakses</h4> </div> <?= $this->endsection(''); ?>

Jangan lupa disimpan ya.

Update view menu.php

Langkah terakhir adalah meng-update file menu.php yang terdapat pada folder Views/template/, setelah file menu.php ini diubah nantinya aplikasi ini akan menampilkan menu sesuai dengan role user, silahkan salin lalu ganti isinya pada file menu.php

Baris kode /Views/template/menu.php
html
<?= $this->extend('template/main'); ?> <?= $this->section('menu'); ?> <?php //akses database $db= \Config\Database::connect(); ?> <?php //menu $id_role = session()->get('id_role'); $nama = session()->get('nama'); if ($id_role > 0) { $queryMenu = $db->query("SELECT menu.id_menu,menu.aktif, menu.menu,menu.menu_slug,menu.link,menu.ikon FROM menu JOIN aksesmenu ON menu.id_menu = aksesmenu.id_menu WHERE aksesmenu.id_role = $id_role AND menu.aktif ='Y' ORDER BY menu.urutan ASC"); } else { return redirect()->to('/profile'); } ?> <ul class="navbar-nav sidebar sidebar-light accordion" id="accordionSidebar"> <a class="sidebar-brand d-flex align-items-center justify-content-center" href="index.html"> <div class="sidebar-brand-icon"> <img src="<?= base_url() ?>/assets/img/logo/logo2.png"> </div> <div class="sidebar-brand-text mx-3">RuangAdmin</div> </a> <hr class="sidebar-divider my-0"> <!-- jika role bukan member --> <?php if ($id_role != 2) { ?> <li class="nav-item"> <a href="/dashboard" class="nav-link"><i class="fas fa-tachometer-alt" title="Dashboard"></i> <span>Dashboard</span></a> </li> <hr class="sidebar-divider"> <?php } else { ?> <li class="nav-item"> <a href="/profile" class="nav-link"><i class="fas fa-user" title="Profile"></i> <span>Profile</span></a> </li> <hr class="sidebar-divider"> <?php } ?> <?php foreach ($queryMenu->getResultArray() as $m) : ?> <li class="nav-item"> <a class="nav-link collapsed" href="<?= $m['link']; ?>" data-toggle="collapse" data-target="#<?= $m['menu_slug']; ?>" aria-expanded="true" aria-controls="collapseBootstrap" title="<?= $m['menu']; ?>"> <i class="<?= $m['ikon']; ?> "></i> <span><?= $m['menu']; ?></span> </a> <?php //submenu $id_menu = $m['id_menu']; $querySM = $db->query("SELECT submenu.id_submenu,submenu.submenu,submenu.link,submenu.ikon,submenu.aktif FROM submenu JOIN menu ON submenu.id_menu = menu.id_menu WHERE submenu.id_menu = $id_menu AND submenu.aktif ='Y' ORDER BY submenu.submenu ASC"); ?> <div id="<?= $m['menu_slug']; ?>" class="collapse" aria-labelledby="headingBootstrap" data-parent="#accordionSidebar"> <div class="bg-white py-2 collapse-inner rounded"> <?php foreach ($querySM->getResultArray() as $sm) : ?> <a class="collapse-item" href="/<?= $sm['link']; ?>"> <i class="<?= $sm['ikon']; ?> text-primary"></i> <?= $sm['submenu']; ?></a> <?php endforeach; ?> </div> </div> </li> <?php endforeach; ?> </ul> <?= $this->endsection(''); ?>

Uji Coba

Prototez
Prototez Bercerita mencari jawaban

Tidak ada komentar untuk "Membuat Hak Akses User bagian 2"