Jag har lite problem nu. Det är så att tidigare använde jag två klasser (Session/Auth) för att:
- Logga in användare
- Logga ut användare
- Kolla behörigheter/åtkomst
Jag har byggt om dom här två, så att dom ser ut såhär:
<?php
define("cookieName", "myCookie");
class Auth {
var $userName;
var $userPassword;
var $session;
var $hashKey;
/**
* Auth constructor
* Checks for valid user automatically
* @param object database connection
* @param string URL to redirect to on failed login
* @param string key to use when making hash of user name and
* password
* @param boolean if passwords are md5 encrypted in database
* (optional)
* @access public
*/
function Auth($userName = '', $userPassword = '', $md5 = TRUE, $hashKey = 'jPDVDVdvdvDVhhy565466%¤&65&%¤&¤%/(/(,rN.W2y5vzFzzVAhHa.3sw'){
$this->userName = $userName;
$this->userPassword = $userPassword;
$this->userAdminLevel = 0;
$this->md5 = $md5;
$this->hashKey = $hashKey;
$this->session = &new Session();
$this->login();
}
/**
* Checks username and password against database
* @return void
* @access private
*/
function login(){
if($this->confirmAuth()){
return true;
}
$login = mysql_real_escape_string($this->userName);
if($this->md5){
$password = mysql_real_escape_string(md5($this->userPassword));
}else{
$password = mysql_real_escape_string($this->userPassword);
}
// Query to count number of users with this combination
$query = "SELECT COUNT(*) AS num_users "
."FROM " . USER_TABLE . " "
."WHERE " . USER_TABLE_LOGIN . " = '" . $login . "' "
."AND " . USER_TABLE_PASSW . " = '" . $password ."'";
// echo $query . "<br />\n";
$result = mysql_query($query) or die(mysql_error());
$row = mysql_fetch_assoc($result);
// If there isn't is exactly one entry
if ($row['num_users'] != 1){
return false;
// Else it's a valid user; set the session variables
}else {
$this->storeAuth($login, $password);
}
}
/**
* Sets the session variables after a successful login
* @return void
* @access protected
*/
function storeAuth($login, $password) {
//Take out user id from database
$query = "SELECT user_id, user_group "
."FROM " . USER_TABLE . " "
."WHERE " . USER_TABLE_LOGIN . " = '$login'";
$result = mysql_query($query) or die(mysql_error());
$userid = mysql_result($result, 0, 0);
$groupid = mysql_result($result, 0, 1);
mysql_free_result($result);
$this->session->set(USER_USERID_VAR, $userid);
if(!(setcookie(cookieName, $this->session->sessid(), time() + 3600)))
die("Couldn't set cookie, please contact site admin.");
$query = "INSERT INTO user_session "
."(sess_session, sess_user, sess_group, sess_page, sess_ipaddr, sess_browser, sess_login, sess_refresh) "
."VALUES "
."("
."'" . $this->session->sessid() . "', "
."" . $userid . ", "
."" . $groupid . ", "
."" . $this->getPageId(basename($_SERVER['PHP_SELF'])) . ", "
."'" . $_SERVER['REMOTE_ADDR'] . "', "
."'" . $_SERVER['HTTP_USER_AGENT'] . "', "
."UNIX_TIMESTAMP(), "
."UNIX_TIMESTAMP()"
.")";
mysql_query($query) or die("Couldn't save data to session table, please contact site admin.\\n " . mysql_error() . $query);
return true;
}
/**
* Confirms that an existing login is still valid
* @return void
* @access private
*/
function confirmAuth(){
if(!isset($_COOKIE[cookieName]))
return false;
$query = "DELETE FROM user_session "
."WHERE DATE_ADD(FROM_UNIXTIME(sess_refresh, '%Y-%m-%d %H:%i:%s'), INTERVAL 60 MINUTE) >= CURRENT_TIMESTAMP";
mysql_query($query) or die("Couldn't prune session table, please contact site admin");
$authCookie = safesql($_COOKIE[cookieName]);
$query = "SELECT "
."COUNT(sess_id) "
."FROM user_session "
."WHERE sess_session = '" . $authCookie . "' "
."LIMIT 1";
$result = mysql_query($query) or die(mysql_error());
if(!(mysql_num_rows($result) == false)){
$query = "UPDATE user_session SET "
."sess_refresh = UNIX_TIMESTAMP() "
."WHERE sess_session = '" . $authCookie . "' "
."LIMIT 1";
mysql_query($query) or die("Couldn't update session table, please contact site admin");
if(!(mysql_affected_rows() == -1)){
return true;
}else{
return false;
}
return false;
}else{
return false;
}
mysql_free_result($result);
}
}
?>
Min inloggning:
<?php
$username = safesql($_POST['username']);
$userpass = safesql($_POST['passwd']);
$return = safesql($_POST['return']);
/* ask for mandatory data or print an error if missing
------------------------------------------------------*/
if(strlen($username) <= 0){
$error[] = "Ange ditt användarnamn";
}
if(strlen($userpass) <= 0){
$error[] = "Ange ditt lösenord";
}else{
/* Check authorization
------------------------------------------------------*/
$auth = new Auth($username, $userpass);
if(!($auth->confirmAuth())){
$error[] = "Du angav ett felaktigt användarnamn eller lösenord";
}else{
if(!write_to_log("user_log", $session->get("userid"), $_SERVER['REMOTE_ADDR'], 2, "n/a", $_SERVER['HTTP_USER_AGENT']))
send_errorreport(basename($_SERVER['PHP_SELF']), __LINE__, "Error when writing to log", "");
/* User logged in, redirect to splashscreen
------------------------------------------------------*/
echo "200|Success";
}
}
?>
Problemet är att vi första inloggning ges meddelandet "Du angav ett felaktigt användarnamn eller lösenord". Grejen är att kakan + raden i sessionstabellen skapas, så allt funkar.
Trycker jag F5 så är jag inne, utan problem.
Det här är det enda som återstår, så jag vore sjukt tacksam om någon kunde hitta felet i koden ovan.
Verkar som sagt som om $auth->confirmAuth(); inte returnerar bool(true) första gången den anropas.
Tack!