Jumat, 06 Maret 2020

PBKK A - Tugas 7 - Mengatur Akses User

Nama: Ayu Mutiara Sari
NRP: 05111740000149

1. Pertama, buat database untuk menyimpan data user pada localhost/phpMyAdmin. untuk lebih mudahnya gunakan code sql dibawah ini:

 CREATE TABLE `users` (  
  `user_id` int(11) NOT NULL AUTO_INCREMENT,  
  `username` varchar(64) NOT NULL,  
  `password` varchar(255) NOT NULL,  
  `email` varchar(255) NOT NULL,  
  `full_name` varchar(255) NOT NULL,  
  `phone` varchar(20) NOT NULL,  
  `role` enum('admin','customer') NOT NULL DEFAULT 'customer',  
  `last_login` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,  
  `photo` varchar(64) NOT NULL DEFAULT 'user_no_image.jpg',  
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,  
  `is_active` tinyint(1) NOT NULL DEFAULT '0',  
  PRIMARY KEY (`user_id`)  
 );  
database tersebut berisi:
  •  user_id: untuk menyimpan id user
  •  username: untuk menyimpan username 
  •  password: untuk menyimpan password (dalam bentuk hash)
  •  email: untuk menyimpan email user
  •  full_name: untuk menyimpan nama lengkap user
  •  phone: untuk menyimpan nomer telepon
  •  role: untuk menyimpan status user (admin/customer)
  •  last_login: untuk menyimpan catatan riwayat login
  •  photo: untuk menyimpan foto user
  •  created_at: untuk menyimpan riwayat pembuatan akun
  •  is_active: untuk menyimpan status aktif atau tidaknya akun user
setelah itu masuk ke halaman insert untuk mengisi data user (akan digunakan untuk percobaan nantinya), contoh:

2. Selanjutnya, membuat model baru pada folder application/models/ dengan nama User_model.php lalu isi dengan kode berikut:
 <?php  
 class User_model extends CI_Model  
 {  
   private $_table = "users";  
   public function doLogin(){  
           $post = $this->input->post();  
     // cari user berdasarkan email dan username  
     $this->db->where('email', $post["email"])  
         ->or_where('username', $post["email"]);  
     $user = $this->db->get($this->_table)->row();  
     // jika user terdaftar  
     if($user){  
       // periksa password-nya  
       $isPasswordTrue = password_verify($post["password"], $user->password);  
       // periksa role-nya  
       $isAdmin = $user->role == "admin";  
       // jika password benar dan dia admin  
       if($isPasswordTrue && $isAdmin){   
         // login sukses yay!  
         $this->session->set_userdata(['user_logged' => $user]);  
         $this->_updateLastLogin($user->user_id);  
         return true;  
       }  
     }  
     // login gagal  
           return false;  
   }  
   public function isNotLogin(){  
     return $this->session->userdata('user_logged') === null;  
   }  
   private function _updateLastLogin($user_id){  
     $sql = "UPDATE {$this->_table} SET last_login=now() WHERE user_id={$user_id}";  
     $this->db->query($sql);  
   }  
 }  

Terdapat 3 method dalam model tersebut, yaitu:

1. method doLogin() untuk melakukan login
2. method isNotLogin() untuk mengecek status telah terlogin atau belum
3. method _updateLastLogin() untuk mengupdate waktu login terakhir

3. selanjutnya, membuat controller baru pada controllers/admin/ untuk login, beri nama Login.php dan isi dengan code berikut:
 <?php  
 class Login extends CI_Controller  
 {  
   public function __construct()  
   {  
     parent::__construct();  
     $this->load->model("user_model");  
     $this->load->library('form_validation');  
   }  
   public function index()  
   {  
     // jika form login disubmit  
     if($this->input->post()){  
       if($this->user_model->doLogin()) redirect(site_url('admin'));  
     }  
     // tampilkan halaman login  
     $this->load->view("admin/login_page.php");  
   }  
   public function logout()  
   {  
     // hancurkan semua sesi  
     $this->session->sess_destroy();  
     redirect(site_url('admin/login'));  
   }  
 }  

4. lal
u atur juga controller lain untuk meload method isNotLogin() untuk mengecek apakah user sudah login atau belum dengan menambahkan kode ini:

 $this->load->model("user_model");  
 if($this->user_model->isNotLogin()) redirect(site_url('admin/login'));  
pada controller/admin/Overview.php dan controller/admin/Product.php pada masing-masing fungsi  _construct sehingga terlihat seperti:

Overview.php
 <?php defined('BASEPATH') OR exit('No direct script access allowed');  
 class Overview extends CI_Controller {  
   public function __construct()  
   {  
           parent::__construct();  
           $this->load->model("user_model");  
           if($this->user_model->isNotLogin()) redirect(site_url('admin/login'));  
      }  
      public function index()  
      {  
     // load view admin/overview.php  
     $this->load->view("admin/overview");  
      }  
 }  


Product.php
 <?php  
 defined('BASEPATH') OR exit('No direct script access allowed');  
 class Products extends CI_Controller  
 {  
   public function __construct()  
   {  
     parent::__construct();  
     $this->load->model("product_model");  
     $this->load->library('form_validation');  
     $this->load->model("user_model");  
     if($this->user_model->isNotLogin()) redirect(site_url('admin/login'));  
   }  
   public function index()  
   {  
     $data["products"] = $this->product_model->getAll();  
     $this->load->view("admin/product/list", $data);  
   }  
   public function add()  
   {  
     $product = $this->product_model;  
     $validation = $this->form_validation;  
     $validation->set_rules($product->rules());  
     if ($validation->run()) {  
       $product->save();  
       $this->session->set_flashdata('success', 'Berhasil disimpan');  
     }  
     $this->load->view("admin/product/new_form");  
   }  
   public function edit($id = null)  
   {  
     if (!isset($id)) redirect('admin/products');  
     $product = $this->product_model;  
     $validation = $this->form_validation;  
     $validation->set_rules($product->rules());  
     if ($validation->run()) {  
       $product->update();  
       $this->session->set_flashdata('success', 'Berhasil disimpan');  
     }  
     $data["product"] = $product->getById($id);  
     if (!$data["product"]) show_404();  
     $this->load->view("admin/product/edit_form", $data);  
   }  
   public function delete($id=null)  
   {  
     if (!isset($id)) show_404();  
     if ($this->product_model->delete($id)) {  
       redirect(site_url('admin/products'));  
     }  
   }  
 }  


5. lalu, buat halaman view untuk login dengan nama login_page.php dan letakan pada folder application/views/admin/

login_page.php
 <!DOCTYPE html>  
 <html lang="en">  
 <head>  
   <meta charset="UTF-8">  
   <meta name="viewport" content="width=device-width, initial-scale=1.0">  
   <meta http-equiv="X-UA-Compatible" content="ie=edge">  
   <title>Login Admin</title>  
   <!-- Bootstrap core CSS-->  
   <link href="<?php echo base_url('assets/bootstrap/css/bootstrap.min.css') ?>" rel="stylesheet">  
 </head>  
 <body>  
   <div class="container">  
     <div class="row">  
       <div class="col-12 col-md-6 text-center mt-5 mx-auto p-4">  
         <h1 class="h2">Login Admin</h1>  
         <p class="lead">Silahkan masuk ke Panel Admin</p>  
       </div>  
     </div>  
     <div class="row">  
       <div class="col-12 col-md-5 mx-auto mt-5">  
         <form action="<?= site_url('admin/login') ?>" method="POST">  
           <div class="form-group">  
             <label for="email">Email</label>  
             <input type="text" class="form-control" name="email" placeholder="Pakai username juga bisa.." required />  
           </div>  
           <div class="form-group">  
             <label for="password">Password</label>  
             <input type="password" class="form-control" name="password" placeholder="Password.." required />  
           </div>  
           <div class="form-group">  
             <div class="d-flex justify-content-between">  
               <div class="custom-control custom-checkbox">  
                 <input type="checkbox" class="custom-control-input" name="rememberme" id="rememberme" />  
                 <label class="custom-control-label" for="rememberme"> Ingat Saya</label>  
               </div>  
               <a href="<?= site_url('reset_password') ?>">Lupa Password?</a>  
             </div>  
           </div>  
           <div class="form-group">  
             <input type="submit" class="btn btn-success w-100" value="Login" />  
           </div>  
         </form>  
       </div>  
     </div>  
   </div>  
 </body>  
 </html>  

6. setelah itu, buka file views/admin/_partials/modal.php untuk mengubah link logout dari kode ini:
 <a class="btn btn-primary" href="login.html">Logout</a>  

menjadi:
 <a class="btn btn-primary" href="<?= site_url('admin/login/logout') ?>">Logout</a>  

setelah semua langkah telah dilakukan maka buka halaman http://localhost/[nama folder]/index.php/admin/ untuk melihat apakah kamu akan diarahkan ke halaman login atau tidak. jika iya, maka autentikasi untuk halaman telah berhasil.

Hasil:
login awal

halaman awal setelah login
ketika akan logout

setelah logout





0 komentar:

Posting Komentar