我在我的代码中使用了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{
}
}
}
答案 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();
这可能会解决您的问题 我想你是在库文件中编写这段代码