編輯:在投訴了自己的答案後,我想更新提供的答案並不令人滿意。沒有人出來,並明確表示這是你的問題,這樣做,你會有一個解決方案。僅僅建議不足以獲得賞金獎勵。最後,問題出在服務器設置上,在對服務器會話進行一些研究後,看着Stackoverflow/Serverfault,我能夠確定如何最好地解決這個問題。因此,我認爲將自己的答案標記爲正確答案並不公平。如何測試認證系統?
我有依靠LDAP驗證身份並使用會話保持用戶認證狀態基於PHP的身份認證系統。
最近我注意到,它似乎把我推回到登錄頁面就像我的會話過期。問題是,它似乎沒有任何特定的原因,我已經注意到,我不知道如何調試/測試這樣的事情。
這裏是我的身份驗證功能,啓動會話:
function authenticateUser($user, $password){
//assuming ldap connection and verification of user login/pass
//this is what will happen with authenticate user which is called
//when user submits login/pass on authentication form.
$_SESSION['id'] = $uID;
$time = time();
$_SESSION['time'] = $time;
$_SESSION['lastActivity'] = $time;
$_SESSION['expiration'] = $time+$cookieExpiration;
$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
$_SESSION['secret'] = md5(rand());
$_SESSION['userHash'] = getSessionHash();
$_SESSION['firstLogin'] = isFirstLogin($user);
//assign cookie to user and log authentication
giveCookie("userHash", $_SESSION['userHash'],0);
logAuthenticationAttempt($user, $_SERVER['REMOTE_ADDR'], 1);
return true;
}//end authenticateUser
給cookie的功能:
function giveCookie($name, $value, $expiration=0){
global $path, $site;
setcookie("userHash", $_SESSION['userHash'], $expiration, $path, $site, true, true);
}//end giveCookie
這裏是我的函數被稱爲每一頁上驗證用戶才讓通過認證他們繼續採取需要認證狀態的行動:
function isValidUser(){
global $links; global $userName; global $userID; global $cookieExpiration;
if(isset($_COOKIE['userHash']) and isset($_SESSION['userHash'])){
if($_COOKIE['userHash'] == $_SESSION['userHash']){
$userName = $_SESSION['nameN'];
$userID = $_SESSION['id'];
//update userHash cookie for additinoal expiration time this way session
$time = time();
$expiration = $time+$cookieExpiration;
$_SESSION['lastActivity'] = $time;
giveCookie("userHash", $_SESSION['userHash'],0);
$_SESSION['expiration'] = $expiration;
return true;
}
}
return false;
}//end isvalidUser()
任何意見或反饋如何測試這將不勝感激。我正在尋找找出爲什麼偶爾執行一些操作後,我被推回到登錄頁面。
在其請求驗證了我在上面做一個頁面如下:
if(!isValidUser()){changePage($links['login']."?refer=".$links['requestHelp']);}
//note: changePage is just a function for header("location: somepage.php");
如果你不能單元測試代碼,也許它沒有任何單位。將你的代碼分成更小,邏輯上相關的部分。 – erenon 2010-09-14 12:35:52
那些2個在邏輯上是一致的,據我所知,驗證用戶大是因爲它必須檢查LDAP連接失敗,綁定,搜索,並再次結合。否則,這兩個功能只能執行小任務。 – Chris 2010-09-14 12:37:48
我個人認爲你需要快速學習面向對象編程。 – RobertPitt 2010-09-14 12:41:33