2013-08-02 52 views
2

我對登錄系統比較陌生。 CodeIgniter可以將會話存儲在數據庫中,這就是我正在做的事情。它存儲基本信息:session_id,ip,agent和last_activity,並具有存儲自定義數據的選項。我已經通過一些教程和讀取我的理解,這是它應該如何工作:(?這是必要的)使用CodeIgniter登錄和會話

  1. 檢查該用戶的會話存在

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

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

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

這有道理嗎?我是否也應該將用戶的加密密碼存儲在會話數據庫中並檢查它?有更好的/不同的方法嗎?

謝謝。

回答

2

請參閱我的吹塑評論:

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

評論:是的,這是必要的,因爲它告訴大家,特別是用戶登錄或不,並可以做一些基於此的活動。如果登錄或登錄/註冊頁面如果不是,則重定向到主頁

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

評論:見上述評論。

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

評論:您可以根據您的要求修改此功能。

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

評論:你需要從數據庫中刪除。

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

你可以在這裏得到更多的信息:細節博客:http://goo.gl/YPllj0

1

它取決於你和你的要求,你要存儲在user informationdatabase沒有。

  1. 這是必要的,當用戶登錄和突然或假設 他關閉瀏覽器,那麼他應該是登錄,默認情況下。
  2. 是的,當你沒有session-id的用戶,那麼你可以給他login-form。 另外session-id entry應在註銷後刪除。
  3. 您可以刪除全部舊條目,並顯示login-form
  4. 註銷你應該清除會話以及刪除數據庫條目。有一點codeigniter已存儲會話在cookie閱讀session,所以檢查cookies也清除。爲此,您可以使用笨本地會話庫from here
7

我覺得你的做法是進入一個稍微走錯了方向,但它是沒有錯的。 你應該多分一點。

什麼會話實際上做,是存儲所需要在請求的倍數的數據量。

的會話表你笨有沒有任何用戶信息。它只負責存儲會話相關數據(session_id等)。一旦你建立了表格,你可以使用CodeIgniter會話,就像你習慣的那樣。它將爲您處理會話管理流程。

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

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

users(user_id, username, password) 

我存儲在會話中的唯一信息是用戶標識。所以無論何時用戶輸入你的頁面,你都應該檢查你的用戶ID是否有sessionfield。

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; 
} 

我們在這裏做的是檢查是否存在與用戶輸入匹配的數據集。正如你問我提供了一個簡單的例子,如何做哈希。當然,你需要自己實現散列功能,或者使用任何可以使用的類。隨你便。也許你應該更多地封裝它,並且已經將哈希密碼傳遞給方法。

如果輸入的憑證與用戶表中的數據集匹配,則該方法將返回用戶標識。我們知道用戶已成功登錄。一旦你將用戶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,並且用戶將再次被提示到登錄表單。

如你所見。您不必關心會話如何在內部處理。隨意詢問是否有不清楚的地方。

說明:代碼示例僅用於說明目的。你需要自己考慮執行:)

快樂編碼!

0

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

讓我們說一個特定的用戶登錄到您的網站。一旦通過身份驗證,您就可以將他們的用戶名和電子郵件地址添加到會話cookie中,從而使您無需在需要時運行數據庫查詢即可在全球範圍內使用這些數據。

若要將數據添加到會話陣列包括使你的新數據給這個函數的數組:

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

其中$數組是你的新數據的關聯數組。這裏有一個例子:

$newdata = array(
    'username' => 'johndoe', 
       'email'  => '[email protected]', 
       'logged_in' => TRUE 
      ); 

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

如果你想在同一時間一個用戶數據添加,set_userdata()也支持這一語法。

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