销毁会话codeigniter

时间:2016-08-19 08:36:27

标签: php codeigniter session web

我在我的代码中使用了session。当我试图注销它的工作。但当我回来时,该程序仍然可以再次访问管理页面。我不知道为什么。我认为它已被摧毁。当管理页面刷新时,会话工作。程序回到主页。关键是我必须先刷新才能使我的会话运作起来。

这是我的代码。

登录控制器:

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

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

文件夹库中的auth:

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

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

    	}
	}
}

3 个答案:

答案 0 :(得分:0)

您可以使用unset来销毁会话。这是一个例子:

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

答案 1 :(得分:0)

好吧,问题发生在Post-build action控制器Dashboard。当您销毁某个会话时function ceklogin()会返回$this->session->userdata('isLogin')(而不是假,check CI docs),因此会通过比较NULL

修改您的($session == FALSE),以便function ceklogin()$session = $this->session->userdata('isLogin')FALSE进行比较。

NULL

<小时/> 对您的案例进行更具分析性的解释(我认为这将有用)

当用户在会话中时,您的代码可以正常工作。

在销毁会话并点击“返回”(调用某种Dashboard控制器方法)后,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检查。)

答案 2 :(得分:0)

在您的退出功能中尝试这种方式

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

这可能会解决您的问题 我想你是在库文件中编写这段代码