2012-01-26 8 views
8

私はcodeigniterの初心者です。私は管理者としてログインするためにログインフォームを使用しています。管理者が正しいユーザー名とパスワードでログインすると、セッション変数を持つホームページに移動し、ログアウトボタンをクリックするとセッションが破棄され、ユーザーにログインするよう指示されます。つまり、フォームページにログインします。codeigniter sess_destroy()が正しく動作していない、何が間違っていますか?

<?php 
class Home extends CI_Controller 
{ 
    function __construct() 
    { 
     parent:: __construct(); 
     $this->is_logged_in(); 
    } 
    function is_logged_in() 
    { 
     $is_logged_in = $this -> session -> userdata('is_logged_in'); 
     if (!isset($is_logged_in) || $is_logged_in != true) 
     { 
      $this -> load -> view('admin/forbidden'); 
     } 
    } 
    function admin_home() 
    { 
     $data['main_content'] = 'home_view'; 
     $this->load->view('admin/home_view'); 
    } 
} 

モデルはadmin_modelです:

<?php 
class Admin extends CI_Controller 
{ 
    function index() 
    { 
     $data['main_content'] = 'admin/log_in'; 
     $this -> load -> view('includes/admin/admin_template', $data); 
    } 
    function log_in() 
    { 
     $this->load->model('admin_model'); 
     $query = $this -> admin_model -> validate(); 
     if ($query)// if the user's credentials validated... 
     { 
      $data = array('user_name' => $this -> input -> post('user_name'), 'is_logged_in' => true); 
      $this -> session -> set_userdata($data); 
      redirect('admin/home/admin_home'); 
     } else// incorrect username or password 
     { 
      $this -> index(); 
     } 
    } 
    function log_out() 
    { 
     $this->session->sess_destroy(); 
     redirect('/admin/admin','refresh'); 
    } 
} 

第二のコントローラは、ホームコントローラです:

第一のコントローラが管理者である今

<?php 
class Admin_model extends CI_Model 
{ 
    function __construct() 
    { 
     parent:: __construct(); 
    } 
    function validate() 
    { 
      $this->db->where('user_name',$this->input->post('user_name')); 
      $this->db->where('password', $this->input->post('password')); 
      $query = $this->db->get('user'); 
      if($query->num_rows==1) 
      { 
       return true; 
      } 
    } 
} 

、それは利用者を想定しセッションをログアウトして破棄することができますが、ブラウザの戻るボタンをクリックすると、ページを戻すことができますchは存在しないと考えられ、セッションは破棄されませんでした。 ここで間違っていることを教えてください。私はcodeigniter 2.1.0を使用しています。

+0

キャッシュからページを取得していますか?または、 'F5'を押すと、ページがリロードされ、ログインしたことが表示されますか? – Jakub

+0

はい、リロードした後でも、別のブラウザ(セッションデータなし)で「安全」なページをプルアップすると、 – Shabib

+0

にログインしたことが示されます。 – Jakub

答えて

10

すべての問題を通過すると、様々な場所で検索した後ブラウザがキャッシュされたページを表示していたために到着しました。問題を作成していたセッションではなく、正常に動作していました。ここ がソリューションです:

<?php 
class Home extends CI_Controller 
{ 
    function __construct() 
    { 
     parent:: __construct(); 
     $this->is_logged_in(); 
     $this->clear_cache(); 
    } 
    function is_logged_in() 
    { 

     if (!$this->session->userdata('is_logged_in')) 
     { 
      redirect('/admin/admin'); 
     } 
    } 
    function clear_cache() 
    { 
     $this->output->set_header("Cache-Control: no-store, no-cache, must-revalidate, no-transform, max-age=0, post-check=0, pre-check=0"); 
     $this->output->set_header("Pragma: no-cache"); 
    } 
    function admin_home() 
    { 
     $data['main_content'] = 'home_view'; 
     $this->load->view('admin/home_view'); 
    } 
} 

は今、おかげで行く:キャッシュをクリアする機能を追加し、コンストラクタ関数でそれを呼び出すホームコントローラで トリック:)ここ は溶液でホームコントローラで行いますこのリンクに "logout feature in code igniter"は、ここで私は解決策を見つけたと完全に動作します:)

4

セッションが破棄されたにもかかわらず、セッションのユーザーデータは、現在のCIページ構築の間、のままです。

予防措置として、あなたは実行する必要があります。

function log_out() 
{ 
    $this->session->sess_destroy(); 
    // null the session (just in case): 
    $this->session->set_userdata(array('user_name' => '', 'is_logged_in' => '')); 

    redirect('/admin/admin'); 
} 

参照:私は最終的にこのquestion.the問題の適切な解決策を見つけたhttp://codeigniter.com/forums/viewthread/110993/P130/#662369

+0

ありがとう、それは動作していません。私はまだ同じ問題に直面しています:( – Shabib

+0

あなたは 'リフレッシュ'リダイレクトを行っている理由は何ですか?どうしても 'redirect( '/ admin/admin');を実行するのはなぜでしょうか?それは他のすべてが失敗しても' $ this-> output-> enable_profiler(TRUE)何が起こっているかを見る。 – Jakub

+0

ここで、この$ this-> output-> enable_profiler(TRUE);を有効にします。 – Shabib

関連する問題