2016-08-19 4 views
1

Я использовал сеанс в своем коде. когда я пытался выйти из системы, он работает. но когда я вернусь назад, программа все равно сможет снова вернуться к странице администратора. Я не знаю, почему. я думаю, что он был разрушен. при обновлении страницы администратора сеанс работает. программа вернется на домашнюю страницу. Дело в том, что я должен сначала обновиться, чтобы завершить сеанс.Уничтожить сеанс codeigniter

это мой код.

контроллер для входа в систему:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
 
class Home extends CI_Controller{ 
 
\t function __construct() 
 
    { 
 
     parent::__construct(); 
 
     $this->load->model('model_user'); //memasukkan file model m_login.php ke dalam controller 
 
    } 
 
    function index() 
 
    { 
 
     $session = $this->session->userdata('isLogin'); //mengabil dari session apakah sudah login atau belum 
 
     if($session == FALSE) //jika session false maka akan menampilkan halaman login 
 
     { 
 
      $this->load->view('home/index_home'); 
 
     }else //jika session true maka di redirect ke halaman dashboard 
 
     { 
 
      redirect('dashboard/index'); 
 
     } 
 
    } 
 
\t 
 
    function do_login() 
 
    { 
 
     $username = $this->input->post("uname"); 
 
     $password = $this->input->post("pass"); 
 
     
 
     $cek = $this->model_user->cek_user($username,md5($password)); //melakukan persamaan data dengan database 
 
     if(count($cek) == 1){ //cek data berdasarkan username & pass 
 
      foreach ($cek as $cek) { 
 
       $level = $cek['level']; //mengambil data(level/hak akses) dari database 
 
      } 
 
      $this->session->set_userdata(array(
 
       'isLogin' => TRUE, //set data telah login 
 
       'uname' \t => $username, //set session username 
 
       'lvl'  \t => $level, //set session hak akses 
 
      )); 
 
       
 
      redirect('dashboard/index','refresh'); //redirect ke halaman dashboard 
 
     }else{ //jika data tidak ada yng sama dengan database 
 
      echo "<script>alert('Gagal Login!')</script>"; 
 
      redirect('home','refresh'); 
 
     } 
 
     
 
    } 
 

 
}

контроллер для приборной панели:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
 
class Dashboard extends CI_Controller{ 
 
\t public function __construct(){ 
 
\t \t parent::__construct(); 
 
\t \t $this->auth->cek_auth(); 
 
\t \t 
 
\t } 
 
\t 
 
\t public function ceklogin(){ 
 
\t \t $session = $this->session->userdata('isLogin'); 
 
    \t if($session == FALSE) 
 
    \t { 
 
     \t \t $this->load->view('home/index_home'); 
 
    \t } 
 
\t } 
 
\t 
 
\t public function index() 
 
\t { 
 
\t \t $this->ceklogin(); 
 
\t \t 
 
\t \t $stat = $this->session->userdata('lvl'); 
 
\t \t 
 
\t \t if($stat=='admin'){ 
 
\t \t \t $this->load->view('admin/home/index_admin',$data); 
 
\t \t }else{ 
 
\t \t \t $this->load->view('member/home/index_member',$data); 
 
\t \t } 
 
\t \t 
 
\t } 
 

 
public function logout() 
 
\t { 
 
\t \t $this->session->sess_destroy(); 
 
\t \t 
 
\t \t redirect('home','refresh'); 
 
\t } 
 
}

Срок авторизации в ВОЛП дер библиотеки:

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 
 

 
class Auth { 
 
    public function cek_auth() 
 
\t { 
 
\t \t $this->ci =& get_instance(); 
 
\t \t $this->sesi = $this->ci->session->userdata('isLogin'); 
 
\t \t $this->hak = $this->ci->session->userdata('stat'); 
 
\t \t if($this->sesi != TRUE){ 
 
\t \t \t redirect('home','refresh'); 
 
\t \t \t exit(); 
 
\t \t } 
 
\t \t 
 
\t } 
 
\t public function hak_akses($kecuali="") 
 
\t { \t 
 
    \t if($this->hak==$kecuali){ 
 
    \t \t echo "<script>alert('Anda tidak berhak mengakses halaman ini!');</script>"; 
 
    \t \t redirect('dashboard/index'); 
 
    \t }elseif ($this->hak=="") { 
 
    \t \t echo "<script>alert('Anda belum login!');</script>"; 
 
    \t \t redirect('home'); 
 
    \t }else{ 
 

 
    \t } 
 
\t } 
 
}

+0

Что вы получаете, когда u var_dump ($ this-> sesi) cek_auth? –

+0

какая версия Codeigniter вы используете? –

+1

codeigniter 2.1.2 –

ответ

0

вы можете использовать unset уничтожить сессию. это пример:

public function logout(){ 
    foreach ($_SESSION as $key => $value) { 
    unset($_SESSION[$key]); 
    } 
    redirect('home','refresh'); 
} 
+0

, когда я попробовал ваш код, мой выход из системы - ошибка –

+0

, потому что класс сеанса на CI v2 не использует собственные php-сессии –

0

Ну, проблема в вашем Dashboard Controler, function ceklogin(). Когда вы уничтожаете сеанс $this->session->userdata('isLogin') возвращает NULL (не false, check CI docs), поэтому он сравнивает ($session == FALSE).

Редактировать function ceklogin() так, чтобы $session = $this->session->userdata('isLogin') сравнивает как FALSE, так и NULL ex.

public function ceklogin(){ 
    $session = $this->session->userdata('isLogin'); 
    if (($session == FALSE) || ($session == NULL)) 
    { 
     $this->load->view('home/index_home'); 
    } 
} 


Более аналитическое объяснение вашего дела (я думаю, что это будет полезно)

Пока пользователь находится на сессии ваш код работает отлично.

После разрушения сеанса и нажатия «назад» (вызов какого-либо метода контроллера панели) $session = $this->session->userdata('isLogin') получает NULL, поэтому он передает отметку ($session == FALSE).

При обновлении страницы сеанса реконструируется и $this->session->userdata('isLogin') получает FALSE значение (так что не проходит ($session == FALSE) проверку.)

+0

Я попытался, но проблема не решена –

0

Попробуйте этот путь в функции выхода из системы

$CI =& get_instance(); 
$CI->load->library('session');  
$CI->session->sess_destroy(); 

это может решить ваша проблема Я предполагаю, что вы пишете этот код в своем файле библиотеки

+0

Вы имеете в виду вот это? добавить один выход из системы? \t общественная функция выхода из системы() \t {\t \t $ this-> ci = & get_instance(); $ this-> ci-> load-> library ('session'); $ this-> ci-> session-> sess_destroy(); \t} –

+0

так что я должен вызвать эту функцию в контроллере тоже? –

Смежные вопросы