wbb2 externer Login

Vor kurzen war ich mit dem Problem konfrontiert einen Externen Login für das wbb2 zu bauen ,also eine Loginbox auf der Hauptseite.Man sollte nach dem Login natürlich nicht im Forum landen sonder wieder auf der Seite auf der man sich ursprünglich eingeloggt hatte. Diese Tatsache machte meinen ersten Lösungsansatz, einfach die entsprechenden POST-Daten dann die login.php des Forums zu senden, hinfällig. Also sah ich mir mit Tampa Data die gesendeten Cookies an. Und siehe da drei Cookies wbb2_userid,wbb2_userpassword,wbb2_lastvist. Also hier die erste Funktion zu Login.

function LoginUser($username, $password)
{
		global $db;
	  //db ist ein mysqli-Objekt siehe hierfür http://de3.php.net/manual/de/book.mysqli.php
		$sql = "SELECT userid FROM bb1_users WHERE username = '".mysql_escape_string($username)."' AND password = '" . md5($password) . "'";
    if ($result=$db->query($sql))
		{
		  $row = $result->fetch_assoc();
		  //gibt es das Feld userid im Array sind die Login-Daten gültig
			if($row['userid'])
			{
					setcookie("wbb2_userid", $row['userid'], time()+3600*24*356, "/", ".example.com");
					setcookie("wbb2_userpassword", md5($password), time()+3600*24*356, "/", ".example.com");
					setcookie("wbb2_lastvist", //name des Cookies
                     time(), // Wert in diesen fall der aktuelle Timestamp
                     time()+3600*24*356, //Ablaufdatum des Cookies
                     "/", // mit / wird der Cookies für alle Unterverzeichnise der Domain verfügbar gemacht
                     ".example.com" // .domain.tld machen wir den Cookies für alle Subdomains verfügbar für den fall dass das Forum sich auf einer Subdomain befindet.);
					//true zurückgeben
					return true;
			}
	}
	//Im falle eines Datenbankfehlers oder üngültigen Login-Daten wird false zurückgegeben
	return false;
}

Jetzt wollen wir aber auch wissen ob der User eingeloggt ist. Dafür reicht es aber leider nich einfach zu prüfen ob der Cookie gesetzt ist oder nicht, da bei einer Anmeldung im Forum nur eine Session gesetzt wird. Hier wieder meine Funktion

function IsUserLoggedIn($get_data=false)
{
  global $db;
    //wenn ein Cookie gesetzt ist
		if(isset($_COOKIE['wbb2_userid']))
		{
		  //und der Cookie wbb2_userid eine Zahl ist
			if (is_numeric($_COOKIE['wbb2_userid']))
			{
				$sql = "SELECT userid, username FROM bb1_users WHERE userid = '".mysql_escape_string($_COOKIE['wbb2_userid'])."' AND password = '".mysql_escape_string($_COOKIE['wbb2_userpassword'])."';";
				$result = $db->query($sql);
				$row = $result->fetch_assoc();
        //Dann Checken wir wieder obs den User gibt und ob seine Passwort stimmt
				if($row['userid'])
				{
				  //wenn der Parameter $get_data gesetzt ist geben wir den namen un die id in einen array zurück
					if($get_data)
						return array("userid" => $row['userid'], "username" => $row['username']);
					//ansonsten nur true
					else
						return true;
				}
				//false zurückgeben wenns den user nich gibt
				else
				{
					return false;
				}
			}
		}
		//Wenn jetzt also kein Cookie gesetzt ist checken wir die Session
		else
		{
		  //hier fragen wir einfach ab ob für den Aktuellen besucher (ip) eine Session existiert
			$sql="SELECT userid FROM bb1_sessions WHERE ipaddress = '".$_SERVER['REMOTE_ADDR']."' ORDER BY userid DESC";
			if($result=$db->query($sql))
			{
				$row = $result->fetch_assoc();
				//Da nicht eingeloggte user die userid 0 bekommen muss die id größer 0 sein
				if($row['userid'] > 0)
				{
					$sql = "SELECT userid, username FROM bb1_users WHERE userid = '".mysql_escape_string($row['userid'])."';";
					$result = $db->query($sql);
					$row = $result->fetch_assoc();
					//siehe oben
					if($row['userid'])
					{
						if($get_data)
							return array("userid" => $row['userid'], "username" => $row['username']);
						else
							return true;
					}
				}
			}
		}
		//für alle anderen fälle wird false zurückgegeben
		return false;
	}

Zum Schluss noch der Logout, wie oben reicht es nicht einfach nur die Cookies zu löschen auch die Session muss weg.

	function LogoutUser()
	{
		global $db;
		$user=IsUserLoggedIn(true);
		//unsere funktion von oben
		if(is_array($user))
		{
      //die wbb2 Session-Daten des eingeloggen User löschen
			$db->query("DELETE FROM bb1_sessions WHERE userid = '".mysql_escape_string($user['userid'])."'");
			//und die PHP session löschen
			session_destroy();
		}
		//dann noch die Cookies löschen
		setcookie("wbb2_userid", -1, time()-3600, "/", ".example.com");
		setcookie("wbb2_userpassword", -1, time()-3600, "/", ".example.com");
		setcookie("wbb2_lastvist", -1, time()-3600, "/", ".example.com");
	}

So ich hoffe mal dass das Ganze einigermaßen verständlich war und ich jemanden damit Helfen konnte ;-) . Fragen, Anregungen und Kritik sind erwünscht.

Share and Enjoy:
  • Twitter
  • Facebook
  • Google Bookmarks
  • RSS
  • del.icio.us
  • MisterWong
  • Digg
  • Sphinn
  • Mixx
  • Blogplay
  • Live
  • MisterWong.DE
  • MySpace
  • StumbleUpon
  • Technorati
  • Yigg

Tags: , , , , , , ,

Hinterlasse einen Kommentar