Projekt

Enkel inloggning (2/4)

2011-05-24 16:21 #0 av: [Fibbe]

I denna artikelserie kommer vi lära oss hur ett inloggningssystem fungerar. Denna inloggning kräver ingen databas! I del 2 kommer vi bygga vidare på föregående artikel och se till att fler medlemmar med olika användarnamn och lösenord kan logga in.

Projektgång

Artikel 1: Inloggning för en medlem

Artikel 2: Inloggning för fler medlemmar

Artikel 3: Olika rättigheter till medlemmarna

Artikel 4: Kryptering av lösenord

 

Inledning

Vi har alltså ett fungerande inloggningssystem för en medlem sedan förra artikeln i denna serie. Även om vi vill ha fler medlemmar vill vi givetvis att systemet ska fungera på exakt samma sätt för övrigt. Vi vill kunna logga in, logga ut och se om vi är inloggad. Vi kommer därför inte att behöva göra så stora ändringar!

För tillfället sparar vi vår medlem i två stycken variabler. Koden ser ut enligt följande (finns i login.function.php):

function login($username, $password)
{
//Rätt användarnamn och lösenord
$correct_user = "Admin";
$correct_pass = "test";

//Steg 1
if ( !empty($username) && !empty($password) )
{

//Steg 2
if ( $username == $correct_user
&& $password == $correct_pass )
{
//Steg3
$_SESSION['user_login'] = TRUE;
}

//Om lösenord eller användarnamn är fel
else
{
return "Användarnamnet eller lösenordet är fel.
Kontrollera dessa och försök igen...";
}

}

//Om användarnamn eller lösen är tomt
else
{
return "Du måste ange lösenord och användarnamn.";
}

}

Variabeln $correct_user sparar användarnamn och $correct_pass sparar lösenord. Om vi fortsätter att använda enkla variabler kommer det bli krångligt att få systemet att fungera för fler användare. Därför kommer vi använda oss av en array istället.

 

Spara användarna i en array

Min tanke är designa arrayen så att den innehåller fler medlemmar, varje medlem ska sedan innehålla sitt eget användarnamn och lösenord. Detta kan vi göra till exempel så här:

$medlem1 = array("login_username" => "Medlem1",
"login_password" => "123456");

$medlem2 = array("login_username" => "Medlem2",
"login_password" => "654321");


$members = array($medlem1, $medlem2);

Vi kan även förkorta detta. Följande ger exakt samma resultat:

$members = array( array("login_username" => "Medlem1",
"login_password" => "123456"),

array("login_username" => "Medlem2",
"login_password" => "654321") );

Nu har vi alltså två medlemmar, en som heter Medlem1 och har lösenord 123456, och en som heter Medlem2 och har lösenord 654321.

Vi byter alltså ut våra två variabler, $correct_user och $correct_pass, till en array istället.

 

Byt ut if-sats till foreach-loop

Problemet vi får nu är att vår if-sats inte kommer fungera längre. För det första finns inte variablerna $correct_user och $correct_pass längre. För det andra ska vi hantera värden från en array och måste då hämta dessa värden innan dem går att hantera.

Följande if-sats måste modifieras:

//Steg 2
if ( $username == $correct_user
&& $password == $correct_pass )
{
//Steg3
$_SESSION['user_login'] = TRUE;
}

//Om lösenord eller användarnamn är fel
else
{
return "Användarnamnet eller lösenordet är fel.
Kontrollera dessa och försök igen...";
}

 

Det vi istället måste göra är alltså följande:

  1. Leta reda på rätt användare
  2. Kontrollera om lösenordet är korrekt
  3. Om användaren inte finns eller om lösenordet är fel, skicka ett felmeddelande.

Först och främst ska vi alltså gå igenom arrayen och kontrollera om användaren finns. Detta görs enklast med en foreach-loop:

foreach ( $members as $id => $member_info )
{
if ( $member_info['login_username'] == $username )
{
// Användaren finns!

//Nu ska vi se om lösenordet är rätt
if ( $member_info['login_password'] == $password )
{
//Även lösenordet är rätt
//Logga in:
$_SESSION['user_login'] = TRUE;

return NULL;
}
}
}

return "Användarnamnet eller lösenordet är fel.
Kontrollera dessa och försök igen...";

I koden ovan loopar vi alltså igenom vår array med medlemmar, för varje medlem kontrollerar vi om användarnamnet stämmer med det användarnamn vi fått via parametern $username.

Om användarnamnet hittas kontrollerar vi om lösenordet är korrekt, om inte fortsättar vi att leta.

Om lösenordet är korrekt sätter vi sessionen user_login till TRUE. Vi är härmed inloggade i systemet! Vi kommer inte att behöva göra något mer i funktionen och skriver därför return. Login-funktionen ska enbart retunera något om vi stöter på ett fel. Eftersom det inte inträffat något fel retunerar vi NULL. Att retunera NULL betyder att vi inte retunerar något alls, men ändå avslutar funktionen.

Om vi inte blir inloggad, i foreach-loopen, kommer koden att köras som vanligt och nå felmeddelandet om att användarnamnet eller lösenordet är fel.

 

Vår login-funktion bör alltså se ut enligt följande vid det här laget:

function login($username, $password)
{
//Medlemar
$members = array( array("login_username" => "Medlem1",
"login_password" => "123456"),

array("login_username" => "Medlem2",
"login_password" => "654321") );

//Steg 1
if ( !empty($username) && !empty($password) )
{
//Loopa igenom medlemmar
foreach ( $members as $id => $member_info )
{
if ($member_info['login_username'] == $username)
{
// Användaren finns!

//Nu ska vi se om lösenordet är rätt
if($member_info['login_password'] == $password)
{
//Även lösenordet är rätt
$_SESSION['user_login'] = TRUE;

return NULL;
}
}
}

return "Användarnamnet eller lösenordet är fel.
Kontrollera dessa och försök igen...";
}
//Om användarnamn eller lösen är tomt
else
{
return "Du måste ange lösenord och användarnamn.";
}
}

Nu ska det alltså fungera att logga in med fler medlemmar. Testa och se!

 

Användbara sessioner

Eftersom vi har fler medlemmar har vi även fler olika användarnamn samt fler olika id, som vi får via foreach-loopen. Det kan vara smart att spara dessa i sessioner för att kunna använda senare på vår sida.

Ändra i foreach-loopen som ligger i funktionen login:

//Loopa igenom medlemmar
foreach ( $members as $id => $member_info )
{
if ( $member_info['login_username'] == $username )
{
// Användaren finns!

//Nu ska vi se om lösenordet är rätt
if ( $member_info['login_password'] == $password )
{
//Även lösenordet är rätt
$_SESSION['user_login'] = TRUE;
$_SESSION['user_id'] = $id;
$_SESSION['user_name']=$member_info['login_username'];
return NULL;
}
}
}

Nu kan vi vart som helst i vårt webbsystem skriva:

echo $_SESSION['user_name'];

Är användaren inloggad kommer användarnamnet skrivas.

OBS! Innan man försöker skriva $_SESSION['user_name'] bör man kontrollera att användaren är inloggad med is_logon(). Annars finns risk att sessionen inte finns och då skriver Php ut en onödig notis om det.

Exempel:

if ( is_logon() )
{
echo 'Du är inloggad som: ' . $_SESSION['user_name'];
}

 

Sammanfattning

Den enda fil vi behövt ändra på är login.function.php. De övriga filerna kan ligga kvar som vanligt. Om något inte fungerar kan du antingen ladda ner källkoden från github eller fråga i forumet. I nästa artikel kommer vi att lära oss hur vi kan ställa in privileriger (rättigheter) åt användarna. Till exempel så att enbart administratören kan se viss information.

 

 

Ladda ner eller titta på hela källkoden

Frågor, diskussioner och förslag angående denna artikelserie.

 

 

Nästa artikel i serien »

Mvh Felix

Intresserad av Php, MySQL eller övrig webbprogrammering?
Välkommen till webbprogrammering.ifokus.se

Anmäl
2011-10-20 13:53 #1 av: MichaelE

Borde det inte vara bättre att använda följande istället för två if-satser?

 if ($member_info['login_username'] == $username && $member_info['login_password'] == $password)
           {
//Även lösenordet är rätt
$_SESSION['user_login'] = TRUE;

return NULL;

}

 

Anmäl
2011-10-20 22:00 #2 av: [Fibbe]

#1

Absolut! Var mer i pedagogiskt syfte jag använde 2 if-satser.

Mvh Felix

Intresserad av Php, MySQL eller övrig webbprogrammering?
Välkommen till webbprogrammering.ifokus.se

Anmäl

Bli medlem på iFokus

För att kunna delta i diskussionen måste du bli medlem på iFokus. Det går snabbt, enkelt, och kostar ingenting. Medlemskapet ger dig tillgång till över 300 sajter.