wiki.phpfreakz.nl
Aanmelden Artikel Overleg Bewerk Geschiedenis Go to the site toolbox

Gebruikerniveaus binnen webapplicatie


Inhoud

Inleiding

Sommige webapplicaties vereisen meerdere type gebruikers. Bijvoorbeeld:

  • Administrators, welke alles kunnen,
  • Moderators welke de gebruikers kunnen beheren, en
  • Gebruikers welke simpelweg gebruik kunnen maken van de site.

Hoe implementeer je dit nou zo flexibel mogelijk in je applicatie? Een mogelijke optie wordt in dit artikel omschreven, maar houdt rekening met het volgende:

In feite bestaan er geen niveaus, alleen groepen gebruikers die rechten hebben. Gebruikers hebben een bepaald recht wel of ze hebben het niet. Dit artikel gaat er vanuit dat er een x aantal groepen gebruikers zijn die letterlijk boven elkaar zijn geplaatst zodat elk hogere groep alles kan wat de onderliggende groepen al konden. Dat is niet flexibel, maar wel snel op te zetten.

Gebruikerniveaus definiëren

Elk niveau krijgt een uniek nummer. Het éérste niveau krijgt nummer 1. Alle nummers daarna dienen altijd het dubbele dan de vorige te zijn.
Dus, eerste is 1.
De volgende is 1 + 1 = 2;
Die daarna is 2 + 2 = 4;
Daarna is 4 + 4 = 8;
Etc:

Je krijgt dus een lijstje zoals dit (afhankelijk hoeveel gebruiker niveaus je hebt):

  • 1
  • 2
  • 4
  • 8
  • 16
  • 32
  • 64
  • 128
  • ...

De gebruikers niveaus worden in dit voorbeeld gedefinieerd in een config.php bestand. Deze kunnen natuurlijk ook gewoon in een database worden gezet.

/**
* verschillende gebruiker niveaus binnen onze applicatie
*/
define("VISITOR", 1 );
define("USER", 2 );
define("MODERATOR", 4 );
define("ADMIN", 8 );

Gebruikers onderverdelen in een gebruikersniveau

Nu we de gebruikersniveaus hebben gedefinieerd dienen de gebruikers van de applicatie in een van deze gebruikersniveaus te zitten. In mijn voorbeeld staan mijn de gebruikers in een MySQL tabel. Ik heb een kolom toegevoegd aan mijn tabel genaamd niveau. Mijn tabel ziet er nu zo uit:

CREATE TABLE gebruiker (
    id              INT(11)      NOT NULL AUTO_INCREMENT,
    gebruikersnaam  VARCHAR(40)  NOT NULL,
    wachtwoord      VARCHAR(50)  NOT NULL,
    naam            VARCHAR(100) NOT NULL,
    niveau          INT(6)       NOT NULL DEFAULT 1,
    PRIMARY KEY( id )
);

In het veld niveau wordt het gebruikersniveau opgeslagen. In dit voorbeeld kan dat dus de waarde 1, 2, 4 of 8 zijn. Nu het gebruikersniveau bekend is, dient dit ook beschikbaar te zijn binnen je webapplicatie. Ik maak meestal gebruik van de methode dat na het inloggen de gebruiker gegevens worden weggeschreven in een sessie. In dit voorbeeld ga ik er dan ook vanuit dat de gebruiker gegevens aanwezig zijn in de sessie genaamd $_SESSION['userdata'].

// start het gebruik van sessies
session_start();
 
// Ik ga er hier vanuit dat de gebruiker is ingelogd
// en dat zijn gegevens als array in de sessie $_SESSION['userdata'] staan!
 
// toon de userdata
print_r( $_SESSION['userdata'] );

Dit zal zoiets moeten weergeven:

Array
(
    [userdata] => Array
        (
            [id] => 23
            [gebruikersnaam] => fUGLY
            [naam] => Teye Heimans
            [niveau] => 2 // dit is dus een USER
        )
 
)

Vaststellen van de secties waarop men autorisatie kan hebben

Oké, nu we weten wat voor niveau een gebruiker is, kunnen we dit gebruiken in onze code. Maar eerst moeten we gaan definiëren wat voor gebruikerssecties er in onze applicatie zitten. Dit gaan we ook definiëren in het config.php bestand.

Ik denk dat een voorbeeld het beste is om dit duidelijk te maken:

/**
* verschillende gebruiker niveaus binnen onze applicatie
*/
define("VISITOR", 1 );
define("USER", 2 );
define("MODERATOR", 4 );
define("ADMIN", 8 );
 
/**
* verschillende secties binnen onze applicatie met bijbehorende autorisatie niveaus
*/
// Gebruiker mag zijn eigen profiel wijzigen
define("CHANGE_OWN_PROFILE",    USER + MODERATOR + ADMIN );
 
// Gebruiker mag een ander profiel wijzigen
define("CHANGE_OTHERS_PROFILE", MODERATOR + ADMIN );
 
// Gebruiker mag zijn profiel verwijderen
define("DELETE_OWN_PROFILE",    USER + MODERATOR + ADMIN );
 
// Gebruiker mag een profiel van iemand anders verwijderen
define("DELETE_OTHERS_PROFILE", ADMIN);
 
// Gebruiker mag een artikel toevoegen
define("ADD_ARTICLE",           USER + MODERATOR + ADMIN );
 
// Gebruiker mag een artikel wijzigen
define("EDIT_ARTICLE",          USER + MODERATOR + ADMIN );
 
// Gebruiker mag een artikel wijzigen van iemand anders
define("EDIT_OTHERS_ARTICLE",   MODERATOR + ADMIN );
 
// Gebruiker mag een artikel verwijderen
define("DELETE_ARTICLE",        MODERATOR + ADMIN );
 
// Gebruiker mag een artikel verwijderen van iemand anders
define("DELETE_OTHERS_ARTICLE", MODERATOR + ADMIN );
 
// Gebruiker mag een artikel bekijken
define("VIEW_ARTICLE",          VISITOR + USER + MODERATOR + ADMIN);

Zoals hierboven te zien is wordt er per onderdeel een nieuwe definitie gemaakt met daarin de autorisatie. Deze variabelen (secties) kunnen later in de code gebruikt worden om te controleren of een gebruiker autorisatie heeft.

De autorisatie

Eindelijk is dan het moment aangekomen waar we in de code onze autorisatie gaan toepassen:

// start het gebruik van sessies
session_start();
 
// include onze configuratie
include("config.php");
 
// controleer of de gebruiker een artikel mag toevoegen
if( isUserAuthorized( ADD_ARTICLE ) )
{
    echo "<a href=\"toevoegen.php\">Klik hier om een artikel toe te voegen</a>\n";
}

In de code hierboven kan door middel van de functie isUserAuthorized gekeken worden of de gebruiker geautoriseerd is voor de opgegeven sectie. Nu dient de functie isUserAuthorized nog gemaakt te worden. Uitleg volgt onderaan.

/**
* Controleer of de gebruiker genoeg rechten heeft om de sectie te bekijken
*
* @param $sectionlevel - autorisatie niveau van de meegegeven sectie
* @return bool - true indien de gebruiker is geautoriseerd om deze sectie te bekijken, anders false.
*/
function isUserAuthorized( $sectionlevel )
{
    // controleer of de sessie gegevens aanwezig zijn
    if( !isset( $_SESSION["userdata"]["niveau"] ) )
    {
        // de sessie gegevens zijn niet aanwezig
        return false;
    }
 
    // haal het gebruikersniveau op (in integer formaat)
    $userlevel = intval( $_SESSION["userdata"]["niveau"] );
 
    // ok, hier gebeurd de werkelijke magic ;-) We gebruiken de bitwise AND operator!
    // controleer of de gebruiker toegang heeft tot de sectie
    return ( $userlevel & $sectionlevel ) > 0 ;
}

Deze funtie controleert eerst of de gebruiker gegevens wel aanwezig zijn. Vervolgens wordt het gebruikerniveau verzameld. Tot slot wordt er gekeken of de gebruiker toegang heeft tot de sectie.

Tot Slot

Met behulp van het bovenstaande idee kun je de autorisatie niveaus verplaatsen naar één centraal punt en hoef je later niet meer de code in om deze te wijzigen. Het wordt heel gemakkelijk om een nieuw niveau toe te voegen of de autorisatie op een bepaalde sectie te wijzigen.

In dit artikel heb ik een implementatie gemaakt waar de gegevens (niveaus, secties) worden opgeslagen in een config.php bestand. Mijn voorkeur ligt zelf bij het opslaan van deze gegevens in een database.

Indien je meer informatie wilt over de bitwise AND operator, neem hier eens een kijkje!

Auteur

Dit artikel is geschreven door Teye Heimans

Site Toolbox:

Persoonlijke hulpmiddelen
De laatste wijziging op deze pagina vond plaats op 31 jul 2008 10:03. - Deze pagina werd 7.969 maal bekeken. - Disclaimers - Over PFZWIKI