2017-04-15 86 views
1

我想解除我當前登錄的用戶session.It工作正常,如果我正常登錄,但是當我使用記住我的設置使用Cookie不會被銷燬。會話不是在codeigniter中銷燬

我對設置會話和餅乾代碼

public function login() { 
    if(isset($this->session->userdata['username']) || isset($_COOKIE['user_id'])){ 
     $this->load->model('User'); 

      $p_uid = $this->User->user_login($_COOKIE['user_id'], $_COOKIE['password']); 

    redirect(base_url() . "dashboard"); 
    }else{ 



    $this->form_validation->set_rules('user_id', 'User ID', 'required'); 
    $this->form_validation->set_rules('password', 'Password', 'required'); 
    if ($this->form_validation->run() == FALSE) { 
     $this->load->view('login/login'); 

    } else { 

     $user_id = $this->input->post('user_id'); 
     $password = $this->input->post('password'); 
     $this->load->model('User'); 

      $p_uid = $this->User->user_login($user_id, $password); 
      //var_dump($p_uid); 
      if ($p_uid) { 
       if(isset($_POST['remember_me'])){ 
        setcookie("user_id",$user_id,time()+86400*30); 
        setcookie("password",$password,time()+86400*30); 

       } 


       redirect(base_url() . "dashboard/"); 
      } else { 
       $data=array(
       "error"=>"Wrong Userid Or Password" 
       ); 
       $this->load->view('login/login',$data); 
      } 

    } 
    } 


} 

和我的註銷功能是:

public function logout(){ 

    $this->load->helper('cookie'); 
    delete_cookie("user_id"); 
    delete_cookie("password"); 

    $this->session->unset_userdata("username"); 
    $this->session->sess_destroy(); 

    redirect(base_url()); 
} 

我在哪裏做的錯誤。請幫忙。謝謝

+2

這是錯誤的$這 - >會話級>用戶數據[ '用戶名']你必須使用這樣的$這個 - > session-> userdata('username') – Nobita

回答

1

我面臨着同樣的問題,前一陣子。我正在嘗試所有可能的方法。但我失敗了。最後我找到了ob_startob_clean的解決方案。退出應該是這樣的:

class controllerName extends CI_Controller 
{ 
    function __construct() 
    { 
     parent::__construct(); 
     ob_start(); 
     $this->load->library('Session'); 
     $this->load->helper('cookie'); 
    } 

    public function logout() 
    { 
     $this->load->driver('cache'); 
     $user_id = array(
      'name' => 'user_id', 
      'value' => '', 
      'expire' => '0', 
      'domain' => '.localhost', 
      'prefix' => '' 
     ); 

     delete_cookie($user_id);    
     $this->session->sess_destroy(); 
     $this->cache->clean(); 

     ob_clean(); 
     redirect(base_url());    
    } 

} 

爲了防止瀏覽器後退按鈕之前的頁面加載,你應該做這樣的事情

$sess = $this->session->userdata('username'); 
if(empty($sess)) 
{ 
    $this->session->set_flashdata('error', 'Session has Expired. Please login'); 
    redirect('loginController/method'); 
} 
else 
{ 
    # success. 
    # continue the normal code here 
} 

FYI:這應該被添加在每個功能中或由constructor使用。

注:不要在Cookie添加密碼。Read - php cookie injection vulnerability?

+0

感謝您的幫助:) –

+0

@BushraShahid工作正常嗎?任何問題? –

+0

是的..現在它正在工作...... :) –

3

首先,你的記憶機制是嚴重的缺陷。見Implementing Secure User Authentication in PHP Applications with Long-Term Persistence

我不明白您的登錄方式如何。您正在檢查會話中是否設置了username,然後是使用Cookie執行登錄。我想你已經成功了,因爲||的第一部分總是失敗,因爲$this->session->userdata['username']永遠不會被設置。正確的方法從會話訪問username是:

$_SESSION['username']
OR
$this->session->userdata('username')
OR
$this->session->username

最後,確保餅乾實際上是由在網絡選項卡檢查您的要求刪除。 Codeigniter通過設置大約一天的負面過期時間來刪除cookie,請查看您的Codeigniter版本中是否出現這種情況。爲了獲得最佳效果,只需再次設置Cookie並使用較長的負面到期時間,而不是檢查cookie是否已設置,請檢查cookie是否爲!empty

1
  1. 要從會話陣列未設置單個元件:

    $這 - >會話級> unset_userdata( 'some_name');

  2. 可以傳遞鍵的陣列,以未設置的多個值:

    $ array_items =陣列( '用戶名'=> '', '電子郵件'=> ''); $ this-> session-> unset_userdata($ array_items);

1
public function check_admin_login() 
    { 
     $admin_email_address=$this->input->post('admin_email_address',true); 
     $admin_password=$this->input->post('admin_password',true); 
     $this->load->model('admin_model','a_model'); 
     $result= $this->a_model->check_admin_login_info($admin_email_address,$admin_password); 
//  echo '<pre>'; 
//  print_r($result); 
//  exit(); 
     $sdata=array(); 

     if($result) 
     { 
      $sdata['full_name']=$result->admin_full_name; 
      $sdata['admin_id']=$result->admin_id; 
      $this->session->set_userdata($sdata); 
      //$sdata[] 
      redirect('super_admin'); 
     } 
     else{ 
      $sdata['message']='Your User Id/Password Invalide !'; 
      $this->session->set_userdata($sdata); 
      $this->load->view('admin/admin_login'); 
     } 
    } 


for login and for logout 


    public function logout() 
    { 
     $this->session->unset_userdata('full_name'); 
     $this->session->unset_userdata('admin_id'); 
     $sdata=array(); 
     $sdata['message']='You are Successfully Logout !'; 
     $this->session->set_userdata($sdata); 
     redirect('admin'); 



    } 
0

對於刪除的cookie

delete_cookie('name', $domain, $path); 

對於刪除/破壞sesstion

$這 - >會話級> sess_destroy();

要銷燬特定會話

$this->session->unset_userdata('name'); 

多個項目

$items = array('item-name1' => '', 'item-name2' => ''); 

$this->session->unset_userdata($items);