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

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

[Artikel 1: Inloggning för en medlem](http://webbprogrammering.ifokus.se/articles/4dd77571d4ebea7075000d7c-enkel-inloggning-14-#4dd2dd3cd4ebea6d7d014c80-1)

**Artikel 2: Inloggning för fler medlemmar**

[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)

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

[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/4ddd0f6ed4ebea77040024e9-enkel-inloggning-34-#4dd2dd3cd4ebea6d7d014c80-1)

## Comment 1
Author: [Borttaget]

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

## Comment 2
Author: [Borttaget]

#1

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