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

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

[Artikel 1: Inloggning för en medlem](4dd77571d4ebea7075000d7c-enkel-inloggning-14-#4dd2dd3cd4ebea6d7d014c80-1)

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

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

Teori
-----

Privilegierna (rättigheterna) är tänkt att fungera som så att vissa användare får en lista med olika privilegier i form av korta strängar. Till exempel: _read\_secret_ eller _read\_hidden_. Dessa ska ställas i vid inloggning. När vi programmerar vårt webbsystem vill vi sedan kontrollera om användaren som besöker sidan har privilegiet _read\_hidden_ eller _read\_secret_ innan vi visar ett innehåll.

Inledning
---------

Anledning till att sätta olika privilegier på användarna är många. När vi bygger mer avancerade system kommer vi att vilja administrera olika delar på sajten genom olika funktioner. För att inte alla ska kunna göra ändringar på sidan vill vi enbart att dem vi litar på ska få tillgång till detta. Vi kanske även vill dela upp vanliga medlemar så att vissa av dem är VIP och får tillgång till extra funktioner.

Vi kommer nu att bygga ett väldigt dynamiskt privilegie-system. Vi kommer kunna skapa hur många privilegier vi vill hur enkelt som helst.

Vi börjar med att skapa tre stycken användare i vårt inloggningssystem. Detta görs precis som vi tidigare gjort i _login.function.php_:

//Medlemar  
$members = array( array("login\_username" => "Medlem",  
                        "login\_password" => "medlem"),  
  
                   array("login\_username" => "Moderator",   
                         "login\_password" => "moderator"),  
  
                   array("login\_username" => "Admin",   
                         "login\_password" => "admin") );

Vi har nu tre medlemmar: _Medlem_, _Moderator_ och _Admin_. _Medlem_ ska inte ha några speciella privilegier, _Moderator_ ska få läsa dolda meddelanden och _Admin_ ska få läsa både dolda och hemliga meddelanden.

Det enklaste sättet att spara privilegierna nu innan vi lärt oss MySQL är i en ny array. Vi skapar denna array under våra medlemmar och döper den till _$priv_. Sedan skapar vi arrayen så att _nyckeln_ är användarnamnet och värdet är privilegier skiljda med komma-tecken. OBS! Inget mellanslag:

$priv = array("Admin"     => "read\_secret,read\_hidden",  
              "Moderator" => "read\_hidden");

Funktion för att ställa in privilegier
--------------------------------------

Vi ska nu skapa en funktion för att ställa in privilegier. Privilegierna sparas i sessioner så gäller dem under den tid användaren är inloggad.

Till denna funktion kommer vi enbart att skicka strängen med de privilegier som ska ställas in. Privilegierna är skiljda med komma-tecken och måste därför separeras först. Detta görs enklast med funktionen _explode();_.

explode-funktionen fungerar så att vi skickar ett tecken som första argument, och en sträng som andra. Vid varje tecken i strängen som motsvarar det tecken vi angett kommer strängen att delas till en array.

Exempel:

explode(",", "ett,två,tre,fyra");

Ovanstående ger:

_array("ett", "två", "tre", "fyra");_

Det första vi ska göra i funktionen är alltså att dela upp privilegierna i en array:

function setPrivileges($priv)  
{  
    $priv\_array = explode(",", $priv);  
}  

Nu har vi alla privilegier i en array som heter $priv\_array. Vi ska alltså nu skapa sessioner med dessa privilegier. För att göra detta så smidigt som möjligt kan vi skapa privilegierna som en array i $\_SESSION.

Något i stil med:

$\_SESSION\['privilegies'\]\['privilegie1'\] = TRUE;  
$\_SESSION\['privilegies'\]\['privilegie2'\] = TRUE  
osv...  

På så sätt vet vi att alltid när vi ska använda oss av privilegier skriver vi $\_SESSION\['privilegies'\], då kommer vi åt vår privilegie-array.

För att göra som nämnt ovan använder vi oss lättast av en foreach-loop:

function setPrivileges($priv)  
{  
    $priv\_array = explode(",", $priv);  
  
    foreach ($priv\_array as $privilege)  
    {  
        $\_SESSION\['privileges'\]\[$privilege\] = TRUE;  
    }  
}

Sätt privilegier vid inloggning
-------------------------------

Det vanligaste sättet att bestämma vilka privilegier en användare har är att bestämma dessa vid inloggning, sedan gäller dessa tills användaren loggar ut. Om privilegierna ändras när användaren är inloggad måste användaren logga ut och in igen för att få rätt behörigheter.

Vi bör alltså lägga till ett par rader i vår inloggningsfunktion för att anropa vår privilegie-funktion. Mitt förslag är att göra detta när de andra sessionerna ställs in. Vi kontrollerar om användaren har några privilegier (i arrayen $priv), om det finns privilegier anropas funktionen setPrivileges:

if ( isset($priv\[$member\_info\['login\_username'\]\]) )  
{  
    setPrivileges($priv\[$member\_info\['login\_username'\]\]);  
}  

Denna kodsnutts sätt lämpligen vid markeringen nedan i foreach-loopen i login-funktionen:

//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'\];  
  
 **/\***  
 **\* SÄTT PRIVILEGIER HÄR!**  
 **\*/**  
  
       return NULL;  
    }  
  }  
}

Funktion för kontroll av privilegier
------------------------------------

Vi måste även ha en funktion som kan kontrollera om användaren har rätt privilegier för att utföra eller läsa en del av vår kod. Denna funktion kommer fungera på samma sätt som is\_logon-funktionen som kontrollerar om vi är inloggad. Dock kommer vi behöva en parametar för vilket privilegie vi vill kontrollera. Grunden till funktionen bör se ut så här:

function is\_privileged($privilegie)  
{  
    // Om $\_SESSION\['privilges'\]\[$privilegie\] finns och är  
    // sant retunera TRUE, annars FALSE  
}  

Med andra ord skulle funktionen kunna se ut så här:

function is\_privileged($privilege)  
{  
    if ( isset($\_SESSION\['privileges'\]\[$privilege\])  
           && $\_SESSION\['privileges'\]\[$privilege\] == TRUE )  
    {  
        return TRUE;  
    }  
    else  
    {  
        return FALSE;  
    }  
}

Denna funktion kan göras effektivare enligt följande:

function is\_privileged($privilegie)  
{  
    if ( isset($\_SESSION\['privileges'\]\[$privilege\]) )  
    {  
        return $\_SESSION\['privileges'\]\[$privilege\];  
    }  
  
    return FALSE;  
}

Om sessionen finns retunerar vi värdet av sessionen. Är det sant retuneras sant, är det falskt retuneras falskt. Finns inte sessionen kommer vi retunera falskt.

Detta går att göra ännu enklare! En if-sats eller loop gäller från { till }. Om vi inte skriver dessa gäller if-satsen eller loopen "en rad". Alltså kan vi förenkla funktionen ytterligare till:

function is\_privileged($privilege)  
{  
    if ( isset($\_SESSION\['privileges'\]\[$privilege\]) )  
        return $\_SESSION\['privileges'\]\[$privilege\];  
  
    return FALSE;  
}

Använda privilegier i praktiken
-------------------------------

Nu är vi alltså klar med alla funktioner vi behöver! Den enda vi kommer använda utanför login.function-filen är is\_privileged. Den används till exempel 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>  
  
<?php  
if ( is\_privileged('read\_hidden') )  
{  
    echo 'Kan enbart läsas av de som   
          har privilegiet "read\_hidden"';  
}  
?>  
  
</body>  
</html>

Förbättringar i function.login.php
----------------------------------

Nu när vi lärt oss nya knep kan vi förekla funktioner i function.login.php.

### Förslag på förenklingar:

Ändra inloggningssessioner till en array.

_Till exempel istället för att skriva $\_SESSION\['login\_username'\] = ...; kan vi skriva $\_SESSION\['login'\]\['username'\] = ...; (även $\_SESSION\['login'\]\['is\_logon'\] och $\_SESSION\['login'\]\['id'\])._

Vi får då en bättre struktur på sessionerna och vet att vi behandlar inloggningssessioner så fort vi skriver $\_SESSION\['login'\]

Förenkla funktionen is\_logon på samma sätt som vi förenklat is\_privilegied.

[Ladda ner eller titta på hela källkoden](https://github.com/Fibbe/Enkel-inloggning-version-3)

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

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