Sistem Login dengan CodeIgniter 4

Artikel pada seri kedua ini kita akan membahas langkah-langkah membuat sistem login, karena artikel ini merupakan artikel berseri maka anda harus membaca dari awal supaya dapat memahami lebih rinci tentang pembahasan ini, pada artikel kali ini masih sama dengan artikel sebelumnya yaitu membahas tentang CodeIgniter 4 dan Ajax.

Membuat Tampilan Login

Kira-kira tampilan halaman login-nya seperti gambar di atas, saya mengambil contohnya dari halaman web https://bootsnipp.com/snippets/bxzmb, nantinya kita akan sedikit ubah sesuai dengan kebutuhan.

Membagi Layout Login

Buatlah sebuah file di dalam folder Views/template, kita beri nama login.php, silahkan salin baris kode berikut:

baris kode login.php
html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <meta name="description" content=""> <meta name="author" content=""> <link href="<?= base_url() ?>/assets/img/logo/logo.png" rel="icon"> <title><?= $judul ?></title> <link href="<?= base_url() ?>/assets/vendor/fontawesome-free/css/all.min.css" rel="stylesheet" type="text/css"> <link href="<?= base_url() ?>/assets/vendor/bootstrap/css/bootstrap.min.css" rel="stylesheet" type="text/css"> <!-- css login --> <link href="<?= base_url() ?>/assets/css/login-style.css" rel="stylesheet"> <!-- jquery --> <script src="<?= base_url() ?>/assets/vendor/jquery/jquery.min.js"></script> </head> <body> <div id="login"> <h3 class="text-center text-white pt-5"><?= $judul ?></h3> <div class="container"> <div id="login-row" class="row justify-content-center align-items-center"> <div id="login-column" class="col-md-6"> <div id="login-box" class="col-md-12"> <!-- Login --> <?= $this->renderSection('form') ?> </div> </div> </div> </div> </div> <script src="<?= base_url() ?>/assets/vendor/bootstrap/js/bootstrap.bundle.min.js"></script> <script src="<?= base_url() ?>/assets/vendor/jquery-easing/jquery.easing.min.js"></script> <!-- Sweet Alert 2--> <script src="//cdn.jsdelivr.net/npm/sweetalert2@11"></script> </body> </html>

selanjutnya kita akan membuat file css, kita beri nama login-style.css lalu simpan pada folder /public/assets/css, silahkan salin baris kode berikut:

Baris kode login-style.css
css
body { margin: 0; padding: 0; background-color: #6777ef; height: 100vh; } #login .container #login-row #login-column #login-box { margin-top: 50px; max-width: 600px; border: 1px solid #9C9C9C; background-color: #f5f5f5; } #login .container #login-row #login-column #login-box .login-form { padding: 20px; }

Membuat View Login Index

Ini merupakan tampilan halaman login, yang akan diakses oleh user, kita akan membuat sebuah folder login dalam folder Views, lalu buatlah sebuah file dengan nama index.php di dalam folder login, perhatikan gambar berikut:

Silahkan salin baris kode berikut:

Baris kode index.php
html
<?= $this->extend('template/login'); ?> <?= $this->section('form'); ?> <?= form_open('login/cek', ['class' => 'login-form']); ?> <?= csrf_field(); ?> <h3 class="text-center text-primary">Proto Login</h3> <div class="form-group"> <label for="username" class="text-primary">Email:</label><br> <input type="text" name="email" id="email" class="form-control" placeholder="Email aktif"> <div class="invalid-feedback errorEmail"> </div> </div> <div class="form-group"> <label for="password" class="text-primary">Password:</label><br> <input type="password" name="password" id="password" class="form-control" placeholder="Password"> <div class="invalid-feedback errorPassword"> </div> </div> <div class="form-group m-t-20"> <button class="btn btn-primary btn-block btnlogin" type="submit">Masuk</button> </div> <div class="form-group m-t-10 row text-center"> <div class="col-sm-5 m-t-20"> <a href="#" class="text-primary"><i class="fas fa-key"></i> <small>Anda lupa password ?</small></a> </div> <div class="col-sm-7 m-t-20"> <a href="#" class="text-primary"><i class="fas fa-user"></i> <small>Mendaftar User Baru</small></a> </div> </div> <?= form_close(); ?> <script> $(document).ready(function() { $('.login-form').submit(function(e) { e.preventDefault(); $.ajax({ type: "post", url: $(this).attr('action'), data: $(this).serialize(), dataType: "json", beforeSend: function() { $('.btnlogin').attr('disabled', 'disabled'); $('.btnlogin').html('Loading...'); }, complete: function() { $('.btnlogin').removeAttr('disabled'); $('.btnlogin').html('Masuk'); }, success: function(response) { //klo ada error if (response.error) { //error email if (response.error.email) { $('#email').addClass('is-invalid'); $('.errorEmail').html(response.error.email); } else { $('#email').removeClass('is-invalid'); $('.errorEmail').html(''); } //error password if (response.error.password) { $('#password').addClass('is-invalid'); $('.errorPassword').html(response.error.password); } else { $('#password').removeClass('is-invalid'); $('.errorPassword').html(''); } } //sukses if (response.sukses) { window.location = response.sukses.link; } }, error: function(xhr, ajaxOptions, thrownError) { alert(xhr.status + "\n" + xhr.responseText + "\n" + thrownError); } }); return false; }); }); </script> <?= $this->endsection(''); ?>

Membuat Controller Login

Pada Controller Login ini, akan disusun sebuah logika yang terdiri dari percabangan untuk mencocokan data yang user input dengan data yang terdapat pada database, jika data sesuai maka user dapat mengakses sistem sesuai dengan role user tersebut, jika tidak maka sistem akan memberikan pesan kesalahan, kurang lebih diagram alir data seperti ini.

Ketika user mengisi form login berupa email dan password, jika:

  1. Email terdaftar dan password sesuai (fungsi verify dapat dibaca di sini), maka dapat mengakses halaman sesuai role
  2. Email tidak terdaftar, maka sistem akan memberikan pesan "Maaf, email tidak terdaftar"
  3. Email terdaftar namun tidak aktif, maka sistem akan memberikan pesan "Email tidak aktif"
  4. Password atau email tidak sesuai, maka sistem akan memberikan pesan "Password atau email salah"

Buatlah Controller Login dengan mengetikan perintah berikut:

css
php spark make:controller login

Nanti akan tersimpan pada folder Controller, silahkan pelajari dan salin baris kode berikut pada file Controller Login.php:

Baris kode Login.php
php
<?php namespace App\Controllers; use App\Controllers\BaseController; use CodeIgniter\HTTP\ResponseInterface; class Login extends BaseController { public function index() { // return view('template/login'); $data['judul'] = "Halaman Login"; return view('login/index', $data); } public function cek() { if ($this->request->isAJAX()) { // tangkap variabel dari form login $email = $this->request->getVar('email'); $password = $this->request->getVar('password'); $validation = \Config\Services::validation(); $valid = $this->validate([ 'email' => [ 'label' => 'Email', 'rules' => 'required|valid_email', 'errors' => [ 'required' => '{field} tidak boleh kosong', 'valid_email' => 'Alamat {field} harus valid', ] ], 'password' => [ 'label' => 'Password', 'rules' => 'required', 'errors' => [ 'required' => '{field} tidak boleh kosong', ] ], ]); if (!$valid) { $msg = [ 'error' => [ 'email' => $validation->getError('email'), 'password' => $validation->getError('password'), ] ]; } else { //PROSES LOGIN //akses database $db = \Config\Database::connect(); $query_cekuser = $db->query("SELECT user.*, role.id_role, role.role FROM user JOIN role ON role.id_role=user.id_role WHERE email='$email'"); $result = $query_cekuser->getResult(); //cek user if (count($result) > 0) { //lanjut ke cek password $row = $query_cekuser->getRow(); $password_user = $row->password; $aktif_user = $row->aktif; if ($aktif_user == 'Y') { if (password_verify($password, $password_user)) { //lanjut buat session log ini $simpan_session = [ 'login' => true, 'email' => $email, 'id_role' => $row->id_role, ]; //mulai sesi masuk session()->set($simpan_session); $id_role = $row->id_role; //jika id rolenya = member arahkan ke profile sisanya ke home if ($id_role == 2) { $msg = [ 'sukses' => [ 'link' => '/profile' ] ]; } else { $msg = [ 'sukses' => [ 'link' => '/dashboard' ] ]; } } else { $msg = [ 'error' => [ 'password' => 'Password atau email salah' ] ]; } } else { $msg = [ 'error' => [ 'email' => 'Email tidak aktif' ] ]; } } else { $msg = [ 'error' => [ 'email' => 'Maaf, email tidak terdaftar' ] ]; } } echo json_encode($msg); } else { exit('Maaf, tidak dapat diproses'); } } public function keluar() { // akhiri sesi session()->destroy(); return redirect()->to('/'); } }

Membuat file Controller dan Views untuk Dashboard dan Profile

Membuat Controller Dashboard dan Profile

Pada baris kode di atas jika user berhasil login, maka akan diarahkan pada halaman Dashboard jika role user-nya adalah Admin dan halaman Profile jika role user-nya adalah member. Nah, untuk itu kita perlu membuat dua buah Controller yaitu Controller Dashboard dan Profile. Silahkan buat Controller tersebut dengan mengetikan perintah tersebut pada Terminal atau Command Line.

css
php spark make:controller dashboard
css
php spark make:controller profile

Lalu salin baris kode berikut:

Baris kode Dashboard.php
php
<?php namespace App\Controllers; use App\Controllers\BaseController; use CodeIgniter\HTTP\ResponseInterface; class Dashboard extends BaseController { public function index() { // menuju dashboard/index $data['judul'] = "Halaman Dashboard"; return view('dashboard/index', $data); } }
Baris kode Profile.php
php
<?php namespace App\Controllers; use App\Controllers\BaseController; use CodeIgniter\HTTP\ResponseInterface; class Profile extends BaseController { public function index() { // menuju profile/index $data['judul'] = "Halaman Profile"; return view('profile/index', $data); } }

Membuat Views Dashboard dan Profile

Selanjutnya kita akan membuat Views untuk Dashboard dan Profile, pertama silahkan buat folder Dashboard dan Profile pada folder Views, lalu buatlah file index.php pada masing-masing folder, salin baris kode berikut ini:

Baris kode Views/dashboard/index.php
html
<?= $this->extend('template/main'); ?> <?= $this->extend('template/menu'); ?> <?= $this->section('konten'); ?> <div class="d-sm-flex align-items-center justify-content-between mb-4"> <h1 class="h3 mb-0 text-gray-800"><?= $judul ?></h1> </div> <div class="text-center"> <img src="<?= base_url() ?>/assets/img/think.svg" style="max-height: 90px"> <h4 class="pt-3">Ini adalah halaman dashboard</h4> </div> <?= $this->endsection(''); ?>
Baris kode Views/profile/index.php
html
<?= $this->extend('template/main'); ?> <?= $this->extend('template/menu'); ?> <?= $this->section('konten'); ?> <div class="d-sm-flex align-items-center justify-content-between mb-4"> <h1 class="h3 mb-0 text-gray-800"><?= $judul ?></h1> </div> <div class="text-center"> <img src="<?= base_url() ?>/assets/img/think.svg" style="max-height: 90px"> <h4 class="pt-3">Ini adalah halaman profile</h4> </div> <?= $this->endsection(''); ?>

Menambahkan pada Routes

Kita akan mengarahkan halaman awal supaya menampilkan Controller Login, sehingga kita akan mengubahnya pada file Routes.php, yang terdapat pada folder app/config/, silahkan pelajari kode baris berikut:

php
<?php use CodeIgniter\Router\RouteCollection; /** * @var RouteCollection $routes */ // tampilan awal $routes->get('/', 'Login::index'); // login $routes->get('/login', 'Login::index'); $routes->post('/login/cek', 'Login::cek'); $routes->get('/login/keluar', 'Login::keluar'); // profile $routes->get('/profile', 'Profile::index'); // dashboard $routes->get('/dashboard', 'Dashboard::index'); // user $routes->get('/user', 'User::index'); $routes->get('/user/tampildata', 'User::tampildata'); $routes->post('/user/ajax_list', 'User::ajax_list'); $routes->get('/user/tambahdata', 'User::tambahdata'); $routes->post('/user/simpandata', 'User::simpandata'); $routes->post('/user/editdata', 'User::editdata'); $routes->post('/user/updatedata', 'User::updatedata'); $routes->post('/user/editpassword', 'User::editpassword'); $routes->post('/user/updatepassword', 'User::updatepassword'); $routes->post('/user/hapus', 'User::hapus');

Uji Coba

Silahkan buka tautan localhost:8080 pada web browser, saya beri nama aplikasinya Proto Login, berikut ini adalah hasilnya:

Prototez
Prototez Bercerita mencari jawaban

Tidak ada komentar untuk "Sistem Login dengan CodeIgniter 4"