2011-05-25 16:17 #0 av: [Fibbe]

I denna artikelserie kommer vi lära oss hur ett inloggningssystem fungerar. Denna inloggning kräver ingen databas! I del 3 kommer vi att fortsätta på inloggningssystemet och göra det möjligt att sätta olika rättigheter/privilegier på användarna.

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

 

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

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

 

 

Nästa artikel i serien »