0

ビューのすべてのページからログアウトするのを手伝ってください..ログアウトリンクをクリックすると、別のページからログアウトしようとしているときに、1つのページからだけで動作しません。. 私のcpntollerコードは次のとおりです:-

function index()
    {
        if($this->session->userdata('logged_in'))
        {
            $session_data = $this->session->userdata('logged_in');
            $data['email'] = $session_data['email'];
            $this->load->view('home_view', $data);
            $this->load->view('home_content_view', $data);
        }
        else
        {
            //If no session, redirect to login page
            redirect('login', 'refresh');
        }
    }

    function logout()
    {
        $this->session->unset_userdata('logged_in');
        session_destroy();
        redirect('home', 'refresh');
    }
4

5 に答える 5

1

まず第一に、codeigniterはphpネイティブセッションを使用しないため、session_destroyは$this->session->sess_destroy()代わりに使用できません。各コントローラーのコンストラクター内(複数のコントローラーがある場合)。ユーザーセッションが存在しない場合は確認し、表示するページにユーザーをリダイレクトします。

class Home extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
        //this condition checks the existence of session if user is not accessing  
        //login method as it can be accessed without user session
        if( !$this->session->userdata('logged_in') && $this->router->method != 'login' ) {
            redirect('login'); 
        }
    }
    function index()
    {
        $session_data = $this->session->userdata('logged_in');
        $data['email'] = $session_data['email'];
        $this->load->view('home_view', $data);
        $this->load->view('home_content_view', $data);
    }

    function logout()
    {
        $this->session->userdata = array();
        $this->session->sess_destroy();
        redirect('home', 'refresh');
    }
}
于 2013-02-11T06:05:07.577 に答える
1

CodeIgniter の _remap() 関数について読むことをお勧めします。ログイン/ログアウトのために私が通常行うことは、CI_Controller を拡張して次のようにするカスタム コントローラーのリマップをオーバーライドすることです。

function _remap($method)
{
    if (method_exists($this, $method) && $this-my_custom_helper->is_logged_in())
    {
        $this->$method();
    }
    else
    {
        redirect('/auth/login/');
    }
}

そうすれば、各コントローラーにログインしているかどうかを確認する必要はありません。もう 1 つの便利な方法は、各コントローラーでアクションの前に実行される before/after フィルターを実装することです。詳しくは説明しませんが、Jamie Rumbelow による MY_Controller はこちらで確認できます。彼のコードから採用できる優れたテクニックがいくつかあります。幸運を!!

于 2013-02-11T09:01:04.437 に答える
0

__construct以下のメソッドを各コントローラーのコンストラクターに入れます。

ユーザーコントローラーのインデックス関数にログインメソッドがあると思います

  if (FALSE !== $this->session->userdata('logged_in')) {
       redirect('/user'); 
  }
于 2013-02-11T05:29:17.023 に答える
0

ユーザーがログアウト ボタンをクリックすると、cal はコントローラー ファイルのログアウト機能に移動します。

その機能では

 public function logout() {
       $this->session->session_destroy();
       redirect("home");
 }
于 2013-02-11T05:30:25.977 に答える
0

これを試して

 function logout()
        {
            $this->session->unset_userdata($session_data); 
            $this->session->sess_destroy();
            redirect('home', 'refresh');
        }
于 2013-02-11T06:46:53.727 に答える