Đăng nhập và đăng xuất trong CodeIgniter 3x

Chức năng đăng nhập, đăng xuất hay còn gọi login, logout trong codeigniter 3x là phần không thể thiếu, để viết được chức năng này cần vận dụng thư viện session trong codeigniter
  • 10:50 17/11/2016
  • Kỳ Nhân
  • 0 Bình luận
  • 1564

- Viết hàm tạo chức năng đăng nhập và đăng xuất hay còn gọi login, logout trong codeigniter ta phải sử dụng, ứng dụng được session.

- Việc đầu tiên các bạn cần làm quen với thư viện session trong CodeIgniter 3x

- Để sử dụng được session trong codeigniter các bạn phải load thư viện session bằng hàm $this->load->library('session'); vì session sài rất nhiều nên các bạn để trong function __construct của class MY_Controller cho tiện, các class sau khỏi phải load nữa

- Để khởi tạo session các bạn sử dụng hàm:

$this->session->set_userdata(array(
    'ten_session1'=> 'gia_tri_chen1',
    'ten_session2'=> 'gia_tri_chen2',
));

- Hàm trên khởi tạo 2 biền session có tên là ten_session1 có giá trị là gia_tri_chen1 và biến ten_session2 có giá trị là gia_tri_chen2, các bạn có thể chỉnh sửa tên biến và giá trị theo ý muốn

- Thư viện session codeigniter còn cung cấp cho chúng ta biến session chỉ sài 1 lần rồi tự xóa, biến này được ứng dụng dùng tạo các thông báo, khi refesh lại sẽ không còn thông báo nữa. cú pháp

$this->session->set_flashdata('message','Sai tài khoản hoặc mật khẩu');

- Như hàm trên khởi tạo biến session tên là message có nội dung là sai tài khoản hoặc mật khẩu, phần này tý ứng dụng vào phần kiểm tra đăng nhập nếu sai sẽ hiện thông báo.

- Vậy muốn lấy giá trị session thì làm thế nào ? Ví dụ muốn lấy biến ten_session1 ở trên ta dùng hàm

echo $this->session->ten_session1

- Kiểm tra biến session có tồn tại hay không ta dùng hàm

$this->session->has_userdata('ten_session1');
// tươnng tự
isset($_SESSION['ten_session1']);

- Để xóa session ta dùng hàm

$this->session->unset_userdata('ten_session1');
//hoac
unset($_SESSION['ten_session1']);

- Sau khi tìm hiểu cơ bản session. ta tiếp tục đi vào phần tạo chức năng đăng nhập trong codeigniter hoặc login trong codeigniter

- Xây dựng giao diện view cho phần đăng nhập admin. Vào application/views/admin tạo file login_view.php với nội dung

<div class="container">
    <div class="login-form">
        <?php if($this->session->message!='') {?>
        <div class="show_error">
            <?=$this->session->message?>
        </div>
        <?php } ?>
        <?php echo form_open('',array('id'=>'form-plogin'));?>
        <div class="form-group">
            <div class="input-group"> 
                <div class="input-group-addon"> <i class="entypo-user"></i></div> 
                <input type="text" class="form-control" name="username" id="username" data-error="Nhập tài khoản" placeholder="Tài khoản" autocomplete="off"> 
            </div>
        </div>
        <div class="form-group">
            <div class="input-group"> 
                <div class="input-group-addon"> <i class="entypo-key"></i> </div> 
                <input type="password" class="form-control" name="password" id="password" data-error="Nhập mật khẩu" placeholder="Mật khẩu" autocomplete="off"> 
            </div>
        </div>
        <div class="form-group"> 
            <button type="submit" class="btn btn-primary btn-block"><i class="entypo-login"></i>Đăng nhập</button> 
        </div>
        <?php echo form_close();?>
    </div>
</div>

- Tạo controller quản lý việc đăng nhập, login. Vào application/controllers/admin tạo file Check.php với nội dung

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class Check extends MY_Controller {
    function __construct() {
        parent::__construct();
        $this->load->model('mcode');
    }
    public function login() {
        if ($this->mcode->admin_logged_in()) {
            redirect('admin', 'refresh');
        }
        if($this->input->post()) {
            if ($this->mcode->admin_login($this->input->post('username'), $this->input->post('password'))) {
                redirect('admin', 'refresh');
            }
            else {
                $this->session->set_flashdata('message','Sai tài khoản hoặc mật khẩu');
                redirect('admin/check/login', 'refresh');
            }
        }
        $this->load->helper('form');
        $this->render('admin/login_view','master');
    }
    public function logout() {
        $this->mcode->admin_logout();
        redirect('admin/check/login', 'refresh');
    }
}

- Vậy để vào giao diện đăng nhập, ta vào đường dẫn localhost/ci/admin/check/login.html. Hàm admin_logged_in được viết trong models Mcode chủ yếu kiểm tra nếu tồn tại session user admin thì nhảy về trang chính admin, khỏi phải hiện giao diện đăng nhập

- Vào application/models/Mcode.php bổ sung một số hàm cần thiết cho phần đăng nhập và đăng xuất

    public function admin_login($user,$pass) {
        $username=$this->mcode->hash($user);
        $password=$this->mcode->hash($pass);
        $query=$this->db->query("select * from users where user_token='$username' and pass_token='$password' and hide=1");
        $item=$query->row();
        if($query->num_rows()>0 && $username==$item->user_token && $password==$item->pass_token) {        
            $this->session->set_userdata(array(
                'admin_name'=> $item->name,
                'admin_user'=> $item->username,
                'admin_id' => $item->id,
                'group_id' => $item->group_id,
            ));
            return true;
        }
        else {
            return false;
        }
    }
    public function admin_logged_in() {
        if($this->session->has_userdata('admin_user') && $this->session->has_userdata('admin_id')) {
            return true;
        }
        else {
            return false;
        }
    }
    public function admin_logout() {
        $this->session->unset_userdata(array('admin_name','admin_user','admin_id','group_id'));
    }

- Hàm admin_login($user,$pass) có tác dụng kiểm tra đúng nếu tồn tại user và pass trùng khớp thì khởi tạo session thôi,

- Hàm admin_logged_in kiểm tra có tồn tại session hay chưa, để kiểm tra đã đăng nhập hay chưa đăng nhập

- Hàm admin_logout() có tác dụng xóa các session đã tạo. Khi xóa rồi sẽ không cho vào admin nửa mà nhảy tới trang yêu cầu đăng nhập. Để làm được điều này tại application/core/MY_Controller.php trong class Admin_Controller thêm dòng code ờ function __construct

function __construct() {
        parent::__construct();
        if (!$this->mcode->admin_logged_in()) {
            redirect('admin/check/login', 'refresh');
        }
}

- Như vậy sau khi chưa đăng nhập các bạn vào thử link localhost/ci/admin/users.html hoặc localhost/ci/admin/groups.html đều nhảy về giao diện bắt buộc đăng nhập

- Ah trước khi test các bạn vào phần users sửa mật khẩu user admin thành 123 hay theo ý các bạn để test đăng nhập nha

- Sau đó nhập vào admin/123 thấy đăng nhập thành công nhảy về đường link localhost/ci/admin.html như vậy hoàn thành bước đăng nhập user

- Vậy muốn hiển thị tên, cách đăng xuất thế nào. Phần này khá đơn giản, vì ta có lưu lại session rồi nên muốn hiện tên chỉ viết dòng code tại chỗ cần hiện thôi

//hiện tên
echo $this->session->admin_name;
//hiện tài khoản
echo $this->session->admin_user

- Còn đăng xuất thành viên, logout user thì chỉ cần thêm dòng code trỏ về link logout đã tạo trong controller Check là ok

localhost/ci/admin/check/logout.html

- Để cho dễ hình dung. Mình viết sẵn trong giao diện khi đăng nhập thành công. Tại application/views/admin/dashboard_view.php chỉnh sửa thành

<div class="container">
    <h1 class="text-center">phan giao dien admin</h1>
    <h3>Chào <?=$this->session->admin_name;?></h3>    
    <p><a href="<?=site_url('admin/check/logout');?>" title="Đăng xuất">Đăng xuất</a></p>
</div>

- Như vậy phần đăng nhập, đăng xuất trong codeigniter đã xử lý xong.

- Từ các controller user, groups các bạn có thể phát triển ra các controller sản phẩm, tin tức ... theo yêu cầu, chức năng website mà các bạn cần.

- Qua các bài trên chắc một số bạn muốn tải phần làm sẵn về đễ tham khảo, các bài trước vì chưa hoàn chình nên mình không muốn share code ra, tới bài này đã hoàn thiện một số hàm cần thiết để xây dựng một dự án bằng codeigniter từ đây các bạn có thể phát triển ra các cms theo ý mình