web-dev-qa-db-ja.com

Codeigniterセッションライブラリを使用して「remember meチェックボックス」を作成する方法

codeigniterでWebサイトの認証システムを構築していて、そのためにセッションライブラリを使用しています

     session->set_userdata('username')

これはセッションを保存します-私はしばらくの間-

ユーザーがセッションを永久に保存できるように、ログインフォームに「remember me」チェックボックスを提供したい-セッションを永久に保存する方法が見つからなかった!?

注: $ sess_expirationは、すべてのユーザーの有効期限を設定するため機能しません。私がしたいのは、ユーザーの設定に基づいて有効期限を設定することです。

それは可能ですか?そしてそれを行う方法?

ありがとう

25
ahmed

[記憶する]チェックボックスがオンになっている場合、ユーザーのシステムにランダムな文字列でCookieを設定します。例えば。:

$cookie = array(
    'name'   => 'remember_me_token',
    'value'  => 'Random string',
    'expire' => '1209600',  // Two weeks
    'domain' => '.your_domain.com',
    'path'   => '/'
);

set_cookie($cookie);

また、このランダムな文字列をusersテーブルに保存します。列remember_me_token

ここで、(まだログインしていない)ユーザーが認証を必要とするページにアクセスしようとすると、次のようになります。

  • 彼のシステムにremember_meトークンの名前でCookieがあるかどうかを確認します
  • そこにある場合は、データベースに同じ値のレコードがあるかどうかを確認します
  • その場合、このユーザーのセッションを再作成します(つまり、ユーザーはログインしています)
  • 彼らが訪れていたページを表示する

上記の要件のいずれかが満たされていない場合は、ログインページにリダイレクトします。

セキュリティ上の理由から、ユーザーがログインするたびにランダムにremember_me_tokenを更新することをお勧めします。ユーザーがログインするたびにCookieの有効期限を更新することもできます。これにより、ユーザーはログインしたままになります。

すべてのコードを記述するのは大変な作業ですが、この機能を自分で実装するのに役立つことを願っています。質問があればコメントしてください。幸運を。

65
Mischa

同じものが必要だった。 CI設定を使用してこれを実行することはできないため、(MY_Session内の)CIセッションクラスのsetcookieメソッドをオーバーライドすることを選択しました。

function _set_cookie($cookie_data = NULL)
{
    if (is_null($cookie_data))
    {
        $cookie_data = $this->userdata;
    }

    // Serialize the userdata for the cookie
    $cookie_data = $this->_serialize($cookie_data);

    if ($this->sess_encrypt_cookie == TRUE)
    {
        $cookie_data = $this->CI->encrypt->encode($cookie_data);
    }
    else
    {
        // if encryption is not used, we provide an md5 hash to prevent userside tampering
        $cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key);
    }

    setcookie(
                $this->sess_cookie_name,
                $cookie_data,
                $this->userdata('rememberme') == true ? $this->sess_expiration + time() : 0,
                $this->cookie_path,
                $this->cookie_domain,
                0
            );

}

もちろん、ユーザーが行った選択に基づいて、セッションの記憶フラグを設定する必要があります。

6
Fer

Issetを使用して、Cookieに値があるかどうかを確認できます。Cookieが削除されると、負の値が返されます。負の値の場合、Cookieを再度設定できます...もちろん、これはCookieを「更新」するようなものです。そのため、ユーザーが有効期限までに来ないと、それらは忘れられます。 (有効期限まで非常に長い時間を設定してください!)

例えば:

<?php
     if (isset($_COOKIE['autologin'])) {   //Checks for cookie
         echo "Welcome back!... Logging you in.";
     }else{  //Sets a cookie
         echo "Please sign in";
         $expiretime=time()+60*60*24*365; //set expire time to a year
         setcookie("autologin", "What is here is not important.", $expiretime);
     };
?>
2
San Bergam

私はこれを行うためにフックを使用しました

  1. 「config.php」設定でフックを有効にする$config['enable_hooks'] = TRUE;

  2. ログインコントローラーで、セッションのチェックボックスの値を保存します

    $this->session->set_userdata('remember_me', $this->input->post('remember_me'));
    
  3. 「hooks.php」にfileこれを追加

    $hook['post_controller_constructor'] = array(
        'class'     => 'Change_Config',
        'function'  => 'change_session_expiration',
        'filename'  => 'change_config.php',
        'filepath'  => 'hooks'
    );
    
  4. 「フック」にフォルダ「change_config.php」というファイルを作成し、これを貼り付けます

    <?php
    class Change_Config {
        public function change_session_expiration() {
            $ci = & get_instance();
    
            $remember = $ci->session->userdata('remember_me');
    
            if($remember && $ci->session->sess_expire_on_close) {
                $new_expiration = (60*60*24*365); //A year milliseconds
    
                $ci->config->set_item('sess_expiration', $new_expiration);
                $ci->config->set_item('sess_expire_on_close', FALSE);
    
                $ci->session->sess_expiration = $new_expiration;
                $ci->session->sess_expire_on_close = FALSE;
            }
        }
    }
    
2
Danilo Colasso

あなたはこれを置くことができます

if ($remember) {

  $new_expiration = (60*60*24*365);

  $this->config->set_item('sess_expiration', $new_expiration);

  $this->config->set_item('sess_expire_on_close', FALSE);

  $this->session->sess_expiration = $new_expiration;

  $this->session->sess_expire_on_close = FALSE;

}
1
Harendra Kumar
$this->session->sess_expiration = '14400';    // expires in 4 hours
$this->session->set_userdata($data);          // set session
1
Jacopo

Sess_expirationを0に設定してから、remember_me = 1のようにカスタム変数をセッションに設定できます。この値を確認し、しばらくしてから必要に応じてセッションを破棄してください。これは回避策になります。

0
Herr