簡體   English   中英

使用CodeIgniter登錄和會話

[英]login and sessions using CodeIgniter

我對登錄系統比較陌生。 CodeIgniter可以在數據庫中存儲會話,這就是我正在做的事情。 它存儲基本知識:session_id,ip,agent和last_activity以及存儲自定義數據的選項。 我已經閱讀了一些教程,根據我的理解,它應該如何工作:

  1. 檢查用戶是否存在會話(這是必要的嗎?)

  2. 檢查會話數據庫中的用戶名(如果它不存在,這將是會話數據庫中的自定義條目),然后顯示登錄表單。 (並在登錄后將用戶名保存到會話數據庫)

  3. 如果會話數據庫中存在用戶名,請檢查last_activity。 如果它比期望的要早(或者如果會話已過期),則顯示登錄表單。 如果它不是太舊,請登錄。

  4. 要注銷,您只需從會話數據庫中刪除用戶名。 (或者我應該使用: $this->session->sess_destroy()

那有意義嗎? 我是否還應該在會話數據庫中存儲用戶的加密密碼並檢查它? 有更好/不同的方式嗎?

謝謝。

我認為你的方法進入了一個稍微錯誤的方向,但它根本沒有錯。 你應該把它分開一點。

會話實際上做的是存儲多個請求所需的數據。

CodeIgniter中的會話表與用戶信息無關。 它僅負責存儲會話相關數據(session_id等)。 設置完表后,您就可以使用CodeIgniter Sessions了。 它將為您處理會話管理過程。

所以讓我們通過登錄過程。

首先,您需要一個用於存儲用戶信息的表。 該表的最簡約實現將是:

users(user_id, username, password)

我在會話中存儲的唯一信息是用戶ID。 因此,每當用戶進入您的頁面時,您應該檢查是否存在具有您的用戶ID的會話字段。

if($this->session->userdata('user_id'))
{
  //User is logged in
}
else
{
  //User is not logged in
}

如果用戶未登錄,則需要顯示登錄表單。 用戶發送表單后,您需要驗證輸入並檢查登錄嘗試是否成功。 您的模型方法可能如下所示

public function attemptLogin($username, $password)
{
  $query = $this->db->get_where('users', array(
    'username' => $username,
    'password' => $this->mysecurityclass->superDuperHashMethod($password)
  ));
  if($query->num_rows() == 0)
    return false;
  return $query->row()->user_id;
}

我們在這里做的是檢查是否存在與用戶輸入匹配的數據集。 正如你所說,我提供了一個簡單的例子,說明如何進行散列。 當然,您需要自己實現散列功能或使用任何現成的類。 由你決定。 也許你應該更多地封裝它並且已經將散列密碼傳遞給方法。

如果輸入的憑據與users表中的數據集匹配,則該方法將返回用戶ID。 我們知道用戶已成功登錄。 獲得用戶ID后,將其存儲在會話中。

$userid = $this->user_model->attemptLogin($username, $pass);
if(!$userid)
{
  //GTFO, login was not successfull
}
else
{
  $this->session->set_userdata('user_id', $userid);
  redirect('home');
}

因此,當登錄成功時,您可以設置會話密鑰並重定向用戶。 現在這個過程又開始了。 但現在我們有一個會話集,我們的初始檢查是否會通過會話字段集。 我們的用戶已登錄。

要記錄用戶,您只需要像您已經提到的那樣簡單地銷毀會話。 由於會話密鑰user_id將不再設置,之后我們的初始檢查將返回false,並且將再次提示用戶登錄表單。

正如你看到的。 您不必關心如何在內部處理會話。 如果有什么不清楚,請隨時詢問。

注意:代碼示例僅用於說明目的。 你需要自己考慮實現:)

快樂的編碼!

請看我的評論:

1.檢查用戶是否存在會話(這是否必要?)

評論 :是的,這是必要的,因為它告訴特定用戶是否登錄,並可以基於此進行一些活動。 如果登錄則重定向到主頁,否則返回登錄/注冊頁面

2.檢查會話數據庫中的用戶名(如果它不存在,這將是會話數據庫中的自定義條目),然后顯示登錄表單。 (並在登錄后將用戶名保存到會話數據庫)

評論 :見上述評論。

3.如果會話數據庫中存在用戶名,請檢查last_activity。 如果它比期望的要早(或者如果會話已過期),則顯示登錄表單。 如果它不是太舊,請登錄。

注釋 :您可以根據您的要求修改此功能。

4.要注銷,您只需從會話數據庫中刪除用戶名。 (或者我應該使用:$ this-> session-> sess_destroy())。

注釋 :您需要從db中刪除它。

默認情況下,CodeIgniter將會話數據存儲在cookie中,根據瀏覽器的不同,cookie的大小上限為2KB-4KB。 如果您嘗試在會話中存儲超過4KB的數據,您將開始遇到問題。

您可以在此處獲取更多信息:詳細博客: http//goo.gl/YPllj0

根據您和您的要求,您希望將user information存儲在database

  1. 有必要,當用戶登錄並突然或假設他關閉瀏覽器時,默認情況下他應該登錄
  2. 是的,當您沒有用戶的session-id ,您可以向他顯示login-form 注銷后也應該刪除session-id entry
  3. 您可以刪除所有舊條目 ,並顯示login-form
  4. 注銷后,您應該清除會話以及刪除數據庫條目。 codeigniter 在cookie中存儲會話的一件事是讀取會話 ,因此請檢查cookies也已清除。 為此,您可以從此處使用Codeigniter本機會話庫

會話數組的一個有用方面是您可以將自己的數據添加到它,它將存儲在用戶的cookie中。 你為什么想做這個? 這是一個例子:

假設某個特定用戶登錄您的網站。 經過身份驗證后,您可以將他們的用戶名和電子郵件地址添加到會話cookie中,使您可以全局使用該數據,而無需在需要時運行數據庫查詢。

要將數據添加到會話數組,需要將包含新數據的數組傳遞給此函數:

$this->session->set_userdata($array);

其中$ array是包含新數據的關聯數組。 這是一個例子:

$newdata = array(
    'username'  => 'johndoe',
               'email'     => 'johndoe@some-site.com',
               'logged_in' => TRUE
           );

$this->session->set_userdata($newdata);

如果要一次添加userdata一個值,set_userdata()也支持此語法。

$this->session->set_userdata('some_name', 'some_value');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM