2011-05-21 10:18 #0 av: [Fibbe]

I denna artikelserie kommer vi lära oss hur ett inloggningssystem fungerar. Denna inloggning kräver ingen databas! Vid den här första artikelns slut kommer vi att kunna logga in med en medlem på vårt system.

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

 

Grunden till systemet

I detta system kommer vi inte använda oss av någon databas. Därför sparar vi användarna direkt i Php-koden. Detta system är lämpligt om enbart några få medlemmar ska få tillgång till en sajt. (Detta system kommer att byggas på med databas i senare artikelserier)

Vi kommer att skapa en fil med funktioner. Denna fil kommer vi sedan att inkludera i alla våra andra filer. Funktioner som vi behöver:

//För att logga in
login($username, $password);

//För att logga ut
logout();

//För att kontrollera om vi är inloggad
is_logon();

Det är faktiskt alla funktioner som behövs. Vi skapar dessa i en fil med namn login.function.php. Anledningen till att vi har med .function innan .php är för att filen enbart kommer innehålla funktioner. För att det ska bli lätt att hålla redan på vilka filer vi ska inkludera är detta ett smart sätt. Det är alltså enbart för utseendet, det påverkar inte filen.

 

 

Funktion för inloggning

Systemet kommer givetvis att bygga på sessioner, som vi kikat lite på i Kom igång med Php (6/7). När vi är inloggad kommer vi att ha en session som heter user_login som har värdet TRUE. För att kunna logga in krävs att vi skriver in rätt lösenord och användarnamn.

Steg för steg hur login($username, $password) ska fungera:

  1. Kontrollera att $username och $password inte är tomma
  2. Kontrollera om $username är samma som användarnamnet vi bestämt och att $password är samma som lösenordet vi bestämt.
  3. Om allt är sant, starta sessionen, user_login, och sätt den till TRUE

Översätter vi detta till kod kan vi få följande:

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;
}

}
}

(Förklaring: utropstecken (!) betyder inte. Med andra ord retunerar empty() TRUE när argumentet är tomt och !empty retunerar TRUE när argumentet inte är tomt)

Nu fungerar faktiskt inloggningen! Men vi kommer inte att få några felmeddelanden om vi skickar fel inloggningsuppgifter. Att säga till användaren att det blev fel kan göras på fler olika sätt. Antingen kan vi skicka användaren till en sida där felmeddelandet finns, eller så kan vi retunera felmeddelandet och sköta resten i vår inloggnings-fil. Vi kommer i nuläget att köra på det sistnämnda.

Alltså:

Om användarnamn eller lösenord är tomma retunerar vi: "Du måste ange ett lösenord och ett användarnamn!"

Om användarnamn eller lösnord är fel retunerar vi: "Användarnamnet eller lösnordet är fel. Kontrollera dessa och försök igen..."

I vår kod blir detta:

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.";
}

}

Nu är inloggningsfunktionen klar!

OBS! Kom ihåg att starta sessionsfunktionen med session_start() högst upp i login.function.php.

 

 

Inloggningsformulär

För att låta besökaren skicka användarnamn och lösenord, till vår inloggninsfunktion, kommer vi använda oss av post-funktionen vi tittat på i Kom igång med Php (6/7).

Vi kommer först att behöva ett HTML-formulär. Vi behöver ett textfält för användarnamn, ett lösenordsfält för lösenord, en submit-knapp för att skicka samt ett dolt fält för att visa Php att vi skickat just inloggningsuppgifter.

HTML-formulär:

<form action="" method="post">
Användarnamn:<br>
<input type="text" name="username"><br>
Lösenord:<br>
<input type="password" name="password"><br>
<input type="hidden" name="login_form" value="1">
<input type="submit" value="Logga in">
</form>

Denna kod ska vi ha i vår index-fil (index.php). Ovanför denna HTML-kod ska vi även ha lite Php-kod som fångar det vi skickar, och skickar det vidare till inloggningsfunktionen. Vi måste givetvis även inkludera vår funktions-fil (login.function.php). Detta gör vi med require för att garrantera att den verkligen inkluderas:

<?php
//Måste vara överst eftersom session_start() finns i filen
require ("login.function.php");
?>

<html>
<head>
<meta http-equiv="Content-Type"
content="text/html;charset=utf-8" />
<title> Enkelt inloggning </title>
</head>
<body>

<?php
//Om vårt inloggningsformulär är postat
if ( isset($_POST['login_form']) )
{
$result = login ($_POST['username'], $_POST['password']);
}

?>

<form action="" method="post">
Användarnamn:<br>
<input type="text" name="username"><br>
Lösenord:<br>
<input type="password" name="password"><br>
<input type="hidden" name="login_form" value="1">
<input type="submit" value="Logga in">
</form>
</body>
</html>

Nu försöker vi logga in och fångar vad login-funktionen retunerar i variabeln $result. Om denna variabel är tom så är vi inloggad, om inte så har vi fått ett felmeddelande. För att skriva eventuellt fel till använderan måste vi lägg till ett par rader:

<?php
//Måste vara överst eftersom session_start() finns i filen
require ("login.function.php");
?>

<html>
<head>
<meta http-equiv="Content-Type"
content="text/html;charset=utf-8" />
<title> Enkelt inloggning </title>
</head>
<body>

<?php
//Om vårt inloggningsformulär är postat
if ( isset($_POST['login_form']) )
{
$result = login ($_POST['username'], $_POST['password']);

//Om $result inte är tom
if ( !empty($result) )
{
echo "<p>$result</p><br>";
}
}

?>

<form action="" method="post">
Användarnamn:<br>
<input type="text" name="username"><br>
Lösenord:<br>
<input type="password" name="password"><br>
<input type="hidden" name="login_form" value="1">
<input type="submit" value="Logga in">
</form>
</body>
</html>

Nu kan vi logga in, vi får även felmeddelanden om det inte går att logga in. För att ha någon nytta av att vi faktiskt kan logga in måste vi skapa nästa funktion.

 

Kontrollera om vi är inloggad

Funktionen is_logon() ska retunera sant om vi är inloggad och falskt om vi inte är det. Med andra ord, funktionen ska retunera sant om sessionen user_login finna och är sann, annars ska den retunera falskt.

Det är faktiskt så enkelt som det låter:

function is_logon()
{
if ( isset($_SESSION['user_login'])
&& $_SESSION['user_login'] == TRUE )
{
return TRUE;
}
else
{
return FALSE;
}
}

Denna funktion ska givetvis också ligga i vår funktions-fil (login.function.php).

 

Funktion för utloggning

Vi måste givetvis även kunna logga ut. Detta görs väldigt enkelt. Vi sätter vår session user_login till falsk, vi kan sedan även ta bort våra sessioner med session_destroy().

Denna funktion ska också ligga i login.function.php:

function logout()
{
$_SESSION['user_login'] = FALSE;
session_destroy();
}

 

Sammanställning

Vi har nu alla funktioner för att bygga ett helt webbsystem med vår inloggning. Vi kan börja med att uppdatera vår index-fil lite mer.

Om vi är inloggad behöver vi ju faktiskt inte visa vårt inloggningsformulär. Därför ska vi enbart visa detta om is_logon() är falskt. Istället för formuläret kan vi visa texten "Inloggad" och en länk till utloggningen:

<?php
//Måste vara överst eftersom session_start() finns i filen
require ("login.function.php");
?>

<html>
<head>
<meta http-equiv="Content-Type"
content="text/html;charset=utf-8" />
<title> Enkelt inloggning </title>
</head>
<body>

<?php
//Om vårt inloggningsformulär är postat
if ( isset($_POST['login_form']) )
{
$result = login ($_POST['username'], $_POST['password']);

//Om $result inte är tom
if ( !empty($result) )
{
echo "<p>$result</p><br>";
}
}

// Om vi är inloggad
if ( is_logon() )
{
echo 'Inloggad (<a href="?logout">logga ut</a>)<br>';
}
else
{
?>
<form action="" method="post">
Användarnamn:<br>
<input type="text" name="username"><br>
Lösenord:<br>
<input type="password" name="password"><br>
<input type="hidden" name="login_form" value="1">
<input type="submit" value="Logga in">
</form>

<?php
}
?>

</body>
</html>

Vi måste även se till att utloggningslänken fungerar:

if ( isset($_GET['logout']) )
{
logout();
header("Location: ./");
}

Denna kodsnutt bör ligga så högt upp i koden som möjligt. Det den gör är att först logga ut, sedan skicka användaren till samma adress som den är på men utan ?logout.

 

Skapa fler sidor i systemet

Nu skapar vi en till sida. Den ska heta hemlig.php. Denna ska enbart kunna läsas av inloggade användare.

Detta löser vi så här:

<?php
//Inkluderar våra inloggnings-funktioner
require ("login.function.php");

//Om vi inte är inloggad
if ( !is_logon() )
{
//Skicka oss till index.php
header("Location: index.php");

//Avsluta, visa inge mer kod på denna sida
exit;
}

//Allt här under kommer ebart att visas för
//dem som är inloggade
?>

<html>
<head>
<meta http-equiv="Content-Type"
content="text/html;charset=utf-8" />
<title> Enkelt inloggning </title>
</head>
<body>
<a href="index.php?logout">Logga ut</a><br>
<p>
Hemligt innehåll!
</p>
</body>
</html>

Länka denna sida från index.php och försök gå till sidan både som inloggad och som utloggad. Det går bara som inloggad!

Vi kan givetvis även visa delar av en sida för alla och andra delar enbart för inloggade medlemmar.

hemlig2.php:

<?php
//Inkluderar våra inloggnings-funktioner
require ("login.function.php");
?>

<html>
<head>
<meta http-equiv="Content-Type"
content="text/html;charset=utf-8" />
<title> Enkelt inloggning </title>
</head>
<body>

<?php
if ( is_logon() )
{
?>

<a href="index.php?logout">Logga ut</a><br>
<p>
Hemligt innehåll!
</p>

<?php

}
else
{
?>

Du är inte inloggad! <a href="index.php">Logga in här</a>

<?php

}
?>
</body>
</html>

Testa även att nå denna sida som både inloggad och utloggad. Det går i båda fallen men det hemliga innehållet visas enbart för inloggade medlemmar.

 

Ladda ner eller titta på hela källkoden

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

 

 

Nästa artikel i serien »