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()
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">×</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:
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(''); ?>
Tidak ada komentar untuk "Membuat Hak Akses User bagian 2"
Posting Komentar
Komentarnya dong cuuuy :D