2010-01-22 129 views
2

我希望有人能幫我解決我提出的問題。會話在用戶認證/登錄中的作用?

我有一個處理一般會話數據的存儲的會話對象,我也有一個驗證用戶憑證的驗證對象。

最初,我將所需的Authentication類名稱傳遞給了我的Session對象,然後創建了一個登錄方法來創建Authentication對象的實例並驗證憑據。我將此驗證的結果存儲在Session變量中,並通過getter使其可用。用戶數據也存儲在會話中供以後使用。除此之外,我還有一個註銷方法,可以從Session中刪除用戶數據,從而將用戶註銷。

我的問題是Session對象在登錄其賬戶的用戶中扮演什麼角色?

什麼其他的方法可能一個建議我去處理用戶登錄,因爲它現在我覺得好像我在我的Session對象樂極生悲包裹起來的立場。

+0

我有一個類似的問題,我在考慮存儲一些東西到APC緩存或內存緩存所以它是在內存中,而不是基於文件的會話或數據庫會話 – JasonDavis 2010-01-22 04:15:29

回答

3

只需調用您的身份驗證方法應觸發Auth內的邏輯以在會話(或某些其他數據存儲)中存儲適當的數據,Auth也應專門用於檢索/撤消此信息。因此,使用例如形成您的評論可能是:

class Auth { 
    public static function authenticate($identity, $pass) 
    { 
    // do lookup to match identity/pass if its good then 

    /* assume $auth is an array with the username/email or 
     whatever data you need to store as part of authentication */ 
    Session::set('auth', $auth); 
    return true; 

    // if auth failed then 
    Session::set('auth', array('user'=>'anonymous')); 
    return false; 
    } 

    public function isAuthenticated() 
    { 
    $auth = Session::get('auth'); 
    if(!$auth) 
    { 
     return false; 
    } 

    return (isset($auth['user']) && $auth['user'] !== 'anonymous'); 
    } 
} 

[...]因爲它的立場,現在我覺得 雖然我得到我的Session對象太多包裹起來 。

和身份證一致。對於身份驗證/證書,您只需與Auth/Acl對象進行交互即可。然後他們會利用這個會話作爲有狀態存儲......但是你不應該在意它甚至存儲在會話中。使用Auth/Acl對象的代碼應該完全不知道這個事實。

例如:

//Bad 

if($session->get('authenticated', 'auth')) 
{ 
    // do stuff 
} 


// also bad 

if(isset($_SESSION['authenticated'])) 
{ 
    // do stuff 
} 


//Good 

if($auth->isAuthenticated()) 
{ 
    // do stuff 
} 

// inside $auth class it might look like this 
public function isAuthenticated() 
{ 
    $store = $this->getSotrage(); // assume this returns the $_SESSION['auth'] 
    return isset($store['authenticated']); 
} 
+0

就這樣我正確理解你,你建議我直接進行身份驗證,然後獲取結果並將其存儲在我的會話中?($ result = Auth :: authenticate($ email,$ psswd)){ Session :: set('user',$ result); } – Andre 2010-01-22 04:24:45

+1

沒有與會話的所有交互操作都應該在auth類中。您不會在auth類之外訪問會話中的auth值。 – prodigitalson 2010-01-22 04:27:29

+0

當你說auth值時,只需要澄清一下,我認爲它是用來驗證用戶名和密碼的憑證。 – Andre 2010-01-22 05:06:53

3

會議是抱着要在某種狀態的在不同的頁面已經管理或如果你需要快速訪問的方式得到它而無需訪問數據庫的用戶數據的好地方。在會話中保留安全信息(re:密碼/ etc)是個不錯的主意,但是快速訪問信息(如用戶名,姓名,電子郵件地址,首選項等)都是放入會話的好數據。儘量保持簡單。

請記住,會話(或相關的cookie)只能用於識別。它不應該用於認證。

認證對象是一個好方法。確保它只保存安全信息,只要它具有所需的所有必要功能以保護敏感數據。

+1

我同意,所以存儲密碼不在存儲的用戶數據列表中。 – Andre 2010-01-22 04:27:02