2012-01-26 26 views
8

Tôi là một newbie trong codeigniter. Tôi đang sử dụng biểu mẫu đăng nhập để đăng nhập với tư cách quản trị viên. Khi người quản trị đăng nhập với tên người dùng và mật khẩu chính xác, anh ta được chuyển đến trang chủ với biến phiên. Sau đó, nếu anh ta nhấp vào nút đăng xuất thì phiên đó được cho là bị hủy và chuyển hướng người dùng đến trang đăng nhập tức là đăng nhập vào trang biểu mẫu.codeigniter sess_destroy() không hoạt động đúng, tôi đang làm gì sai?

Bộ điều khiển 1 là admin:

<?php 
class Admin extends CI_Controller 
{ 
    function index() 
    { 
     $data['main_content'] = 'admin/log_in'; 
     $this -> load -> view('includes/admin/admin_template', $data); 
    } 
    function log_in() 
    { 
     $this->load->model('admin_model'); 
     $query = $this -> admin_model -> validate(); 
     if ($query)// if the user's credentials validated... 
     { 
      $data = array('user_name' => $this -> input -> post('user_name'), 'is_logged_in' => true); 
      $this -> session -> set_userdata($data); 
      redirect('admin/home/admin_home'); 
     } else// incorrect username or password 
     { 
      $this -> index(); 
     } 
    } 
    function log_out() 
    { 
     $this->session->sess_destroy(); 
     redirect('/admin/admin','refresh'); 
    } 
} 

Bộ điều khiển thứ hai là bộ điều khiển nhà:

<?php 
class Home extends CI_Controller 
{ 
    function __construct() 
    { 
     parent:: __construct(); 
     $this->is_logged_in(); 
    } 
    function is_logged_in() 
    { 
     $is_logged_in = $this -> session -> userdata('is_logged_in'); 
     if (!isset($is_logged_in) || $is_logged_in != true) 
     { 
      $this -> load -> view('admin/forbidden'); 
     } 
    } 
    function admin_home() 
    { 
     $data['main_content'] = 'home_view'; 
     $this->load->view('admin/home_view'); 
    } 
} 

mô hình

là admin_model:

<?php 
class Admin_model extends CI_Model 
{ 
    function __construct() 
    { 
     parent:: __construct(); 
    } 
    function validate() 
    { 
      $this->db->where('user_name',$this->input->post('user_name')); 
      $this->db->where('password', $this->input->post('password')); 
      $query = $this->db->get('user'); 
      if($query->num_rows==1) 
      { 
       return true; 
      } 
    } 
} 

Bây giờ, nó coi người dùng để đăng xuất và hủy phiên, nhưng nếu tôi nhấp vào nút quay lại của trình duyệt, tôi có thể lấy lại trang whi ch được cho là không được và phiên không bị phá hủy. hãy cho tôi biết tôi đang làm gì sai ở đây. Tôi đang sử dụng codeigniter 2.1.0.

+0

Sau khi nhấn nút quay lại, bạn có đang truy xuất một trang từ bộ nhớ cache không? Hoặc nếu bạn nhấn 'F5' thì trang có tải lại và hiển thị bạn đã đăng nhập không? – Jakub

+0

có, ngay cả sau khi tải lại nó cho thấy tôi đăng nhập – Shabib

+0

nếu bạn kéo lên một trang 'an toàn' trong một trình duyệt khác (không có dữ liệu phiên) nào bạn nhận được trong là tốt? – Jakub

Trả lời

10

sau khi đi qua tất cả các khó khăn và tìm kiếm ở những nơi khác nhau tôi cuối cùng đã tìm thấy một giải pháp thích hợp cho vấn đề này question.the đến vì trình duyệt đang hiển thị các trang được lưu trong bộ nhớ cache.không phải là phiên đang tạo sự cố và nó hoạt động bình thường. đây là giải pháp: trong bộ điều khiển nhà thêm một chức năng để xóa bộ nhớ cache và gọi đó là trong hàm constructor hiện các trick :) đây là bộ điều khiển nhà với các giải pháp:

<?php 
class Home extends CI_Controller 
{ 
    function __construct() 
    { 
     parent:: __construct(); 
     $this->is_logged_in(); 
     $this->clear_cache(); 
    } 
    function is_logged_in() 
    { 

     if (!$this->session->userdata('is_logged_in')) 
     { 
      redirect('/admin/admin'); 
     } 
    } 
    function clear_cache() 
    { 
     $this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate, no-transform, max-age=0, post-check=0, pre-check=0"); 
     $this->output->set_header("Pragma: no-cache"); 
    } 
    function admin_home() 
    { 
     $data['main_content'] = 'home_view'; 
     $this->load->view('admin/home_view'); 
    } 
} 

bây giờ nhờ đi vào liên kết này "logout feature in code igniter", đây là nơi tôi đã tìm thấy giải pháp và nó hoạt động hoàn hảo :)

4

Nếu bạn đăng xuất, mặc dù phiên bị hủy, phiên sử dụng dữ liệu vẫn là trong suốt thời gian xây dựng trang CI hiện tại.

Như một biện pháp phòng ngừa, bạn nên làm:

function log_out() 
{ 
    $this->session->sess_destroy(); 
    // null the session (just in case): 
    $this->session->set_userdata(array('user_name' => '', 'is_logged_in' => '')); 

    redirect('/admin/admin'); 
} 

Xem: http://codeigniter.com/forums/viewthread/110993/P130/#662369

+0

cảm ơn bạn, nhưng nó không hoạt động. tôi vẫn phải đối mặt với cùng một vấn đề: ( – Shabib

+0

bất kỳ lý do nào bạn đang thực hiện chuyển hướng 'làm mới'?Tại sao không làm một vị trí dựa trên một chỉ làm 'chuyển hướng ('/ admin/admin');' Đó có thể là attributing cho vấn đề, cũng nếu tất cả những người khác không cho phép '$ this-> output-> enable_profiler (TRUE);' để xem những gì đang xảy ra. – Jakub

+0

nơi cho phép $ this-> output-> enable_profiler (TRUE) ;? – Shabib

Các vấn đề liên quan