codeigniterでWebサイトの認証システムを構築していて、そのためにセッションライブラリを使用しています
session->set_userdata('username')
これはセッションを保存します-私はしばらくの間-
ユーザーがセッションを永久に保存できるように、ログインフォームに「remember me」チェックボックスを提供したい-セッションを永久に保存する方法が見つからなかった!?
注: $ sess_expirationは、すべてのユーザーの有効期限を設定するため機能しません。私がしたいのは、ユーザーの設定に基づいて有効期限を設定することです。
それは可能ですか?そしてそれを行う方法?
ありがとう
[記憶する]チェックボックスがオンになっている場合、ユーザーのシステムにランダムな文字列で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の有効期限を更新することもできます。これにより、ユーザーはログインしたままになります。
すべてのコードを記述するのは大変な作業ですが、この機能を自分で実装するのに役立つことを願っています。質問があればコメントしてください。幸運を。
同じものが必要だった。 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
);
}
もちろん、ユーザーが行った選択に基づいて、セッションの記憶フラグを設定する必要があります。
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);
};
?>
私はこれを行うためにフックを使用しました
「config.php」設定でフックを有効にする$config['enable_hooks'] = TRUE;
ログインコントローラーで、セッションのチェックボックスの値を保存します
$this->session->set_userdata('remember_me', $this->input->post('remember_me'));
「hooks.php」にfileこれを追加
$hook['post_controller_constructor'] = array(
'class' => 'Change_Config',
'function' => 'change_session_expiration',
'filename' => 'change_config.php',
'filepath' => 'hooks'
);
「フック」にフォルダ「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;
}
}
}
あなたはこれを置くことができます
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;
}
$this->session->sess_expiration = '14400'; // expires in 4 hours
$this->session->set_userdata($data); // set session
Sess_expirationを0に設定してから、remember_me = 1のようにカスタム変数をセッションに設定できます。この値を確認し、しばらくしてから必要に応じてセッションを破棄してください。これは回避策になります。