# Enkel inloggning (1/4)
Author: [Borttaget]

Projektgång
-----------

**Artikel 1: Inloggning för en medlem**

[Artikel 2: Inloggning för fler medlemmar](http://webbprogrammering.ifokus.se/articles/4ddbbece88f47256bd00060e-enkel-inloggning-24-#4dd2dd3cd4ebea6d7d014c80-1)

[Artikel 3: Olika rättigheter till medlemmarna](http://webbprogrammering.ifokus.se/articles/4ddd0f6ed4ebea77040024e9-enkel-inloggning-34#articles-1)

[Artikel 4: Kryptering av lösenord](http://webbprogrammering.ifokus.se/articles/4df10ed488f47250340007cd-enkel-inloggning-44#4dd2dd3cd4ebea6d7d014c80-1)

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)](http://webbprogrammering.ifokus.se/articles/4dd54fb488f472385f0018a5-kom-igang-med-php-67-#4dd2dd3cd4ebea6d7d014c80-1). 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)](../4dd54fb488f472385f0018a5-kom-igang-med-php-67-#4dd2dd3cd4ebea6d7d014c80-1).

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](https://github.com/Fibbe/Enkel-inloggning-version-1)

[Frågor, diskussioner och förslag angående denna artikelserie.](http://webbprogrammering.ifokus.se/discussions/4dd792dad4ebea706f001086-enkel-inloggning#4dd2dad588f4721678015b62-1)

[Nästa artikel i serien »](http://webbprogrammering.ifokus.se/articles/4ddbbece88f47256bd00060e-enkel-inloggning-24-#4dd2dd3cd4ebea6d7d014c80-1)
