【问题标题】:Destroy session codeigniter销毁会话代码点火器
【发布时间】:2016-12-26 08:26:42
【问题描述】:

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

这是我的代码。

登录控制器:

<?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');
	}
}

文件夹库中的授权:

<?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{

    	}
	}
}

【问题讨论】:

  • 当你使用 cek_auth 的 var_dump($this->sesi) 时你会得到什么?
  • 您使用什么版本的 Codeigniter?
  • 很好,让我们从一开始就说:CI v2 上的会话类不使用原生 PHP 会话。它生成自己的会话数据。它需要 (1) 您的配置文件中有一个 加密密钥 和 (2) Mcrypt 扩展 安装。我在您的代码中没有看到任何$this-&gt;load-&gt;library('session'),您必须 (3) 自动加载会话库。 (1)、(2) 和 (3) 在您的系统中是否正常?
  • 是的...我已经按照你说的做了。但我的问题没有解决

标签: php codeigniter session web


【解决方案1】:

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

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

【讨论】:

  • 这是因为 CI v2 上的会话类不使用原生 php 会话
【解决方案2】:

在您的注销功能中尝试这种方式

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

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

【讨论】:

  • 你的意思是这样吗?添加一个功能注销?公共函数 logout() { $this->ci =& get_instance(); $this->ci->load->library('session'); $this->ci->session->sess_destroy(); }
  • 所以我也必须在控制器中调用该函数?
【解决方案3】:

嗯,问题出在你的Dashboard 控制器function ceklogin()。当你销毁一个会话$this-&gt;session-&gt;userdata('isLogin')返回NULL(不是假的,check CI docs),所以它通过了比较($session == FALSE)

编辑您的function ceklogin(),以便$session = $this-&gt;session-&gt;userdata('isLogin')FALSENULL 进行比较。

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


对您的案例进行更分析的解释(我认为这会很有用)

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

在销毁会话并点击“返回”(调用仪表板控制器的某些方法)后,$session = $this-&gt;session-&gt;userdata('isLogin') 得到NULL,因此它通过了($session == FALSE) 检查。

当您刷新页面时,您的会话将被重建并且$this-&gt;session-&gt;userdata('isLogin') 获得FALSE 值(因此它没有通过($session == FALSE) 检查。)

【讨论】:

    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 2015-06-18
    • 2011-11-25
    • 1970-01-01
    • 2012-05-25
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多