Pagina 1 van 2 12 LaatsteLaatste
Weergegeven resultaten: 1 t/m 20 van 27
  1. #1
    Approved 9-lifer passero's schermafbeelding
    Lid sinds
    28/11/03
    Locatie
    Surbiton (London)
    Berichten
    6.269
    iTrader
    5 (100%)
    Weblogs
    3

    [PROG] rollen en rechten

    Hoe kan je het best rollen en rechten inbouwen in een project?
    Momenteel zit ik te denken aan iets maar ik vermoed dat het niet deftig is en een beetje omslachtig.

    Momenteel heb ik een functie met 2 parameters waarbij ik de user en de rol meegeef. Daarin controleerd hij of de user het recht heeft op die rol. Hij geeft gewoon een boolean terug.

    Als ik dan ergens wil kijken of die user voldoende rechten heeft. Bijvoorbeeld editeren van bepaalde gegevens gebeurd het zo:

    Code:
    function edit()
    {
       if(user.isInRole(aRole)
       {
          doeEdit;
       }
       else
       {
          showMessage;
       }
    }
    natuurlijk als je dat overal op die manier moet doen dan kruipt daar veel werk in en het is niet gecentraliseerd.
    Ik vroeg me dus af of er een manier bestaat die beter is dan deze...

  2. #2
    Member
    Lid sinds
    12/10/02
    Locatie
    Gent
    Berichten
    14.847
    iTrader
    2 (100%)
    Wat bedoel je met niet gecentraliseerd?

    Je hebt hier uiteindelijk maar 2 mogelijkheden hoor:

    ofwel de rechten expliciet bij het gebruikerssysteem plaatsen ofwel de gebruiker in een groep plaatsen die dan gelinkt is met rechten. Dan moet je later sowieso controle doen of de user wel toegang heeft tot bepaalde delen.
    Je kan natuurlijk het iets algemener doen en bv. een object aanmaken met rechten x,y,z voor een user met die flags en een object met rechten y,z en u voor een andere user, maar dan moet dat weer binnen die klasse geïmplementeerd worden, enz., enz. Misschien bedoel je dit met gecentraliseerder.
    edit: vbtje wat ik bedoel:

    Code:
    //Loadpage ding:
    if(user.hasRole(role::admin))
    {
        Page* page = new Page(ADMIN_ACCESS);
    }
    else
    {
        Page* page = new Page();
    }
    Natuurlijk kan je in bovenstaand vb. ipv met identifiers te werken ook gewoon een AdminPage klasse en UserPage klasse maken, afgeleid van Page of met boolean argumenten werken (niet iedereen is zo voor identifiers), valt allemaal te zien naar je complexiteit van het systeem.
    Hierin wordt dus de role enkel gebruikt voor het inladen van het systeem en binnen de pagina zelf enkel systemen van die pagina gebruikt. Mssch bedoel je dat met meer gecentraliseerd.
    Kheb hier trouwens Page genomen omdak wa me php-stuff in men kop zat .

    de context kan ook handig zijn , want bv. in php + db systemen wordt het vaak genoeg gedaan zoals jij zegt. Het valt ook te zien of je dat user object veel nodig hebt. Als je enkel hiervoor bv. de user moet injecten in je class lijkt het me nogal wiedes om iets zoals mijn code te doen , als je echter toch constant user-info aan het ophalen bent is er niet veel mis met jouw systeem.

    Je kan natuurlijk, als er maar 1 user is, aan een singleton toevoegen welke rechten er op dit moment toegankelijk zijn (dus eigenlijk globals gebruiken ).

    Zo zullen er nog wel enkele manieren bestaan , kheb is zitten zoeken (interesseert me wel) naar user acces patterns of zo, maar niet direct iets handig gevonden buiten wat theoretische zaken. Het lijkt mij ook iets dat meer afhankelijk is van systeem tot systeem.

    edit2: je kan ook chain-of-command pattern uitbreiden en bv. Edit toevoegen aan je CommandHandler met de nodige voorwaarden en dan in die commandhandler controleren of de user aan die voorwaarden voldoet.

    edit3: mssch is het visitor pattern ook iets, ma da trekt imho redelijk op jouw originele implementatie

    enz...
    Laatst gewijzigd door killgore; 22 juli 2006 om 23:05

  3. #3
    Approved 9-lifer passero's schermafbeelding
    Lid sinds
    28/11/03
    Locatie
    Surbiton (London)
    Berichten
    6.269
    iTrader
    5 (100%)
    Weblogs
    3
    mmmm
    zal het dan maar zo laten

    Kvind het vrij raar eigenlijk dat hier geen deftig pattern voor bestaat. De meeste grote applicaties hebben toch een user beheer met rechten enzo.

  4. #4
    Member tmagus's schermafbeelding
    Lid sinds
    11/01/04
    Locatie
    Machelen
    Berichten
    1.318
    iTrader
    6 (88%)
    toch normaal dat er geen pattern voor is aangezien nie nodig is...

    een gebruiker heeft een bepaald recht of rechten en voor dat die gebruiker iets mag doen wordt da recht van de gebruiker gecontrolleerd ofwel maak je programma zo dat als de gebruiker in logt vb delen van programma nie gaan moet je maar een keer checken bij inloggen als admin of guest of whatever is

  5. #5
    Member
    Lid sinds
    12/10/02
    Locatie
    Gent
    Berichten
    14.847
    iTrader
    2 (100%)
    ooit al van leestekens gehoord?

  6. #6
    Member tmagus's schermafbeelding
    Lid sinds
    11/01/04
    Locatie
    Machelen
    Berichten
    1.318
    iTrader
    6 (88%)
    Citaat Oorspronkelijk geplaatst door killgore
    ooit al van leestekens gehoord?
    lol, ja aangezien er 3 instaat

    jeezes man

  7. #7
    Member
    Lid sinds
    30/07/03
    Berichten
    631
    iTrader
    0
    Citaat Oorspronkelijk geplaatst door tmagus
    lol, ja aangezien er 3 instaat

    jeezes man
    Tsjah, iémand moest het zeggen :P

  8. #8
    Banned T00mpje's schermafbeelding
    Lid sinds
    11/07/06
    Berichten
    46
    iTrader
    0
    Lollig, in Java is zoiets standaard ingebakken in J2EE EJB2.0 (declaratief) EJB3.0 imperatief via annotaties, Spring (AOP) of Acegi (uitbreiding).

    Het komt er dan op aan een SecurityContext te definieren met users en roles, en op de te beschermen code te zetten @AccessAllowed (Role.ADMIN)

  9. #9
    Member Joriz's schermafbeelding
    Lid sinds
    5/05/03
    Berichten
    187
    iTrader
    0
    alsook .NET framework 2.0 waar je naast de standaard providers ook nog custom providers kunt aanmaken

  10. #10
    Banned T00mpje's schermafbeelding
    Lid sinds
    11/07/06
    Berichten
    46
    iTrader
    0
    Wat uiteraard allemaal afgekeken is van zaken die Java Platform al tiental jaar doet

  11. #11
    Member
    Lid sinds
    13/11/04
    Berichten
    62
    iTrader
    0
    Strategy patroon is hier perfect voor.

    Heb geen goesting om het allemaal uit te typen - PM me je e-mail of zo als je een paar files wilt hebben met een toepassing ervan.

  12. #12
    Member
    Lid sinds
    12/10/02
    Locatie
    Gent
    Berichten
    14.847
    iTrader
    2 (100%)
    Citaat Oorspronkelijk geplaatst door Reck
    Strategy patroon is hier perfect voor.

    Heb geen goesting om het allemaal uit te typen - PM me je e-mail of zo als je een paar files wilt hebben met een toepassing ervan.
    strategy pattern is zeer gelijkaardig aan het eerste wat ik had gepost

    (deze code dus):

    Code:
    //Loadpage ding:
    if(user.hasRole(role::admin))
    {
        Page* page = new Page(ADMIN_ACCESS);
    }
    else
    {
        Page* page = new Page();
    }
    enkel zal je dan (zoals ik ook vermelde), dan meer zoiets doen:

    Code:
    //Loadpage ding:
    if(user.hasRole(role::admin))
    {
        context.setPage(new AdminPage());
        //of (iets strategy-achtiger :p):
        page.setEditStrategy(new AdminEdit());
    } 
    else
    {
        ...
    }
    Maar daar blijft erbij dat je ergens die user.hasRole moet gaan aanpsreken he , wat vnl. zijn initiële vraag was.

  13. #13
    Member
    Lid sinds
    13/11/04
    Berichten
    62
    iTrader
    0
    Voorwoord: onderstaande code gaat ervan uit dat er maar één persoon tegelijk ingelogd kan zijn. Denk maar dat het dient voor een programma dat ergens op een computer draait. Wanneer de gebruiker wil beginnen werken, moet hij eerst z'n username en password ingeven. Deze worden dan vergeleken met deze in een bestandje waar tevens de rollen die aan de gebruiker zijn toegekend vermeld staan en aldus worden aan de gebruiker z'n rollen toegekend bij het inloggen.


    Een makkelijke manier om het op te lossen. Laten we aannemen dat er 2 rollen zijn: Administrator en Guest. Administrator en Guest mogen alletwee inloggen en uitloggen. Administrator mag hiernaast ook printA() en printB() oproepen, Guest mag alleen maar PrintB() oproepen.

    Begin met het definiëren van een klassa IUser. Dis is de interface die alle acties bevat die uitgevoerd kunnen worden. We hebben hierboven 4 acties gedefiniëerd, dus we krijgen het volgende. Let op dat elke functie een boolean terug geeft. Waarom we dit doen zal later duidelijk worden.

    Code:
    interface IUser
    {
    	public boolean printA();
    	public boolean printB();
    	public boolean login(String username, String password);
    	public boolean logout();
    }
    Hierna definiëren we een klasse CurrentUser. Dit is onze ingelogde gebruiker. Onze ingelogde gebruiker heeft een stel rollen toegekend gekregen, dus we voorzien een Vector $currentRoles om deze op te slaan. Hiernaast implementeert onze CurrentUser tevens de IUser interface en verwijst de verantwoordelijkheid voor het uitvoeren van de acties door naar z'n rollen. De rollen zullen we later programmeren.

    Code:
    class CurrentUser implements IUser
    {
    	private Vector $currentRoles = new Vector();
    	
    
    	public boolean printA()
    	{
    		boolean done = false;
    		for(int i = 0; i < $currentRoles.size() && done == false; i++)
    			done = ((IUser)$currentRoles.elementAt(i)).printA();
    	
    		if(done == false) return false;
    		
    		return true;
    	}
    
    	public boolean printB()
    	{
    		boolean done = false;
    		for(int i = 0; i < $currentRoles.size() && done == false; i++)
    			done = ((IUser)$currentRoles.elementAt(i)).printB();
    	
    		if(done == false) return false;
    		
    		return true;
    	}
    
    	public boolean login(String username, String password)
    	{
    		//hier komt code om een bestandje uit te lezen, om username en password
    		//na te kijken en om de rollen in te lezen in de Vector $currentRoles
    
    		//als dit allemaal perfect verloopt return je true, als er een fout in
    		//sluipt dan return false
    	}
    
    	public boolean logout()
    	{
    		$currentRoles.clear();
    		return true; 	
    		
    		//we gaan ervan uit dat zo'n simpele operatie niet mis
    		//kan lopen, dus doen we niet de moeite	om te checken of
    		//er iets fout gelopen is. We geven altijd true terug, omdat
    		//we geen fout verwachten.
    	}
    }
    Zie hoe we printA() en printB() niet door CurrentUser laten uitvoeren... we laten de rollen dit oplossen. Return true geeft natuurlijk aan dat de operatie succesvol verlopen is, return false geeft een fout aan. Deze false kan om 2 redenen worden terug gegeven.

    Enerzijds kan een gebruiker die ingelogd is als Guest de operatie printA() hebben proberen uit te voeren. De for loop zal op zoek gaan naar een rol die de bevoegheid heeft om deze operatie uit te voeren. De rol Administrator is echter niet toegekend aan de ingelogde gebruiker. 'done' blijft dus false.

    Anderzijds kan het zijn dat een ingelogde gebruiker een operatie heeft proberen uit te voeren waarvoor hij gerechtigd is, maar dat deze operatie zelf een fout heeft ondervonden en daarom geen 'true' rapporteert om het succesvol uitvoeren van de operatie te bevestigen.

    Werken met True en False is hier verre van perfect. Zelf een paar excepties schrijven, is hier een veel betere keuze. Alle excepties van heel het systeem zullen op een bepaald moment langs het CurrentUser object passeren (als ze niet vroeger opgevangen zijn). Deze excepties opvangen laat je toe om nuttige(!) error boodschappen voor de gebruiker te genereren.
    Soit, dit terzijde.


    Nu gaan we ons bezighouden met de rollen. We beginnen met het schrijven van een abstracte klasse UserRole die voor alle methodes die niet door alle gebruikers uitgevoerd kunnen worden 'false' terug geeft. De methodes die wel door alle gebruikers uitgevoerd kunnen worden laten we 'true' terug geven. De eigenlijke rollen zullen deze klasse implementeren.

    Code:
    abstract class UserRole implements IUser
    {
    	public boolean printA() {return false;}
    	public boolean printB() {return false;}
    
    	public boolean login(String username, String password) {return true;}
    	public boolean logout() {return true;}
    }
    Nu definiëren we de Guest rol. Let op dat we de acties die de Guest niet mag uitvoeren (printA() dus) niet vermelden. Deze wordt immers overgeërfd van UserRole.

    Code:
    class Guest extends UserRole
    {
    	public boolean printB()
    	{
    		//nu hebben we 2 opties. Of we zetten hier effectief code (met als nadeel
    		//dat we deze code moeten dupliceren bij de rol Administrator) of we
    		//encapsuleren alle code van alle acties ergens in een klasse die we zullen
    		//aanspreken telkens we een actie willen uitvoeren.
    		//Beide keuzes zijn natuurlijk slecht, maar dit is maar een voorbeeld.
    		//In de praktijk is het het simpelste dat je de Facade van de module
    		//aanspreekt die de uit te voeren actie omvat. Deze Facade moet of een
    		//Singleton zijn of moet zich ergens bij het opstarten in ons UserManagement
    		//systeem geregistreerd hebben.
    
    		//hier gaan we nu ook false of true moeten teruggeven naargelang de
    		//module rapporteert of de actie al dan niet succesvol is uitgevoerd.
    	}
    
    	//login() en logout() zijn nergens gedefiniëerd. Dit is niet nodig daar deze
    	//al in CurrentUser staan.
    }
    En voor de Administrator hebben we:

    Code:
    class Administrator extends UserRole
    {
    	public boolean printA()
    	{
    		//zelfde commentaar
    	}
    
    	public boolean printB()
    	{
    		//zelfde commentaar
    	}
    
    
    	//login() en logout() zijn nergens gedefiniëerd. Zie commentaar Guest.
    }
    Wat een hoop werk zeg (en verdomd veel typewerk).

    Hoe werken we nu met dezen hoop brol?


    Code:
    CurrentUser $cu = new CurrentUser();
    $cu.login(uw_naam, uw_paswoord);
    
    $cu.printA();
    $cu.printB();

    Nemen we aan dat we inloggen als Guest.

    - $cu.login() zal aan $cu de rol Guest toekennen.
    - $cu.printA() zal de actie printA() van de rol Guest oproepen. Deze hebben we niet geherdefiniëerd toen we de klasse Guest schreven, en zal dus 'false' terug geven (net zoals we in de klasse UseRole vermeld hebben). We kunnen deze 'false' negeren en dan gebeurt er niets of we kunnen deze gebruiken om een error te genereren (als ge dit van plan bent, dan zijn excepties beter - toch nog maar es herhalen).
    - $cu.printB() zal de actie printB() van de rol Guest oproepen. Deze hebben we in de klasse Guest wel geherdefiniëerd en dus zal de gewenste code uitgevoerd worden.

    Voila.


    Opmerking 1

    De *ahem* kracht van deze manier zit hem in 3 punten:

    - Je kan dit als een aparte laag implementeren tussen GUI en onderliggende logica. Deze laag is verantwoordelijk voor het nagaan welke acties een gebruiker mag uitvoeren en deze dan verder te delegeren naar de onderliggende logica. Dit systeem is dus helemaal losgekoppeld van de eigenlijke logica.
    - Een gebruiker kan meerdere rollen toegekend krijgen. Het is perfect mogelijk iemand zowel Administrator als Guest te maken. Deze gebruiker kan dan natuurlijk zowel de acties van de Administrator als deze van de Guest uitvoeren.
    - Het toevoegen van nieuwe rollen is enorm simpel. Dit behoeft geen verdere commentaar.


    Opmerking 2

    De *kuch* aandachtige lezer zal zich nu wel hebben afgevraagd waarom die IUser er eigenlijk bijstaat. Op het eerste zicht doet die immers niet veel. Wel die IUser zorgt ervoor dat wanneer we ergens een nieuwe actie toevoegen (bv. printC()), maar deze ergens in deze wirwar van klassen vergeten te definiëren (we voegen printC() bv. toe bij CurrentUser, maar niet bij UserRole), dat de andere klassen gaan klagen en je het project niet aan de praat zal krijgen. IUser is dus eigenlijk de stok achter de deur die zulke stomme fouten moet voorkomen.

  14. #14
    Member
    Lid sinds
    12/10/02
    Locatie
    Gent
    Berichten
    14.847
    iTrader
    2 (100%)


    nice post, ge hebt er wel wat tijd in gestoken zo te zien

  15. #15
    Member UniKorn's schermafbeelding
    Lid sinds
    20/09/02
    Locatie
    Leuven
    Berichten
    542
    iTrader
    0
    Je kan ook gewoon het Security Application Block gebruiken van het Microsoft Enterprise Instrumentation Framework. Die zorgt voor een meer abstracte laag. Ben alleen niet honderd procent meer zeker dat die ook nog rollen ondersteund. Maar Framework 2.0 zal dat zeker ondersteunen.

    Voor Web security kan je trouwens al je code centraal in de global asax zetten zodat ze op iedere pagina uitgevoerd wordt.

  16. #16
    Approved 9-lifer passero's schermafbeelding
    Lid sinds
    28/11/03
    Locatie
    Surbiton (London)
    Berichten
    6.269
    iTrader
    5 (100%)
    Weblogs
    3
    al die frameworks zullen nie werken bij mij want tis in php dak het schrijf

    @reck: thx
    zal ik eens op mijn gemak bekijken

  17. #17
    Banned T00mpje's schermafbeelding
    Lid sinds
    11/07/06
    Berichten
    46
    iTrader
    0
    Leve Java, lol.

    Seciurity op een methode?

    @RolesAllowed({Role.Admin})
    public void deleteUser();

    lalalala

  18. #18
    Approved 9-lifer passero's schermafbeelding
    Lid sinds
    28/11/03
    Locatie
    Surbiton (London)
    Berichten
    6.269
    iTrader
    5 (100%)
    Weblogs
    3
    ge zijt vet mee java als uw hosting geen tomcat ondersteunt

  19. #19
    Banned T00mpje's schermafbeelding
    Lid sinds
    11/07/06
    Berichten
    46
    iTrader
    0
    Pfft cheapo

  20. #20
    Member
    Lid sinds
    1/08/02
    Locatie
    Ninove
    Berichten
    379
    iTrader
    0
    Ik kan uitleggen hoe dit in een grote db applicatie werkt, misschien vind je het wel nuttig.

    Je hebt de volgende tabellen: USER (bevat alle gebruikers), USER_GROUP (bevat alle gebruikersgroepen, bijvoorbeeld 'admin','superuser','guest'). Elke gebruiker is gelinkt met 1 groep. ACCESS (bevat een lijst van alle functionaliteiten die moeten worden afgeschermd), USER_GROUP_ACCESS (linkt gebruikersgroepen met functionaliteiten tot waar deze toegang hebben).
    Telkens je een nieuwe functionaliteit implementeert zet je er een "if" rond, bvb: if CurrentUser.AccessGranted('create_new_users') {...}.
    Die functie AccessGranted checkt of de usergroup waar de gebruiker toe behoort, toegang heeft tot de functionaliteit ('create_new_users' in het voorbeeld).

    Dit soort structuur wordt in veel grote applicaties toegepast, in praktijk zal het nog wat complexer zijn, maar de basis blijft dezelfde.
    Good luck.

Pagina 1 van 2 12 LaatsteLaatste

Discussie informatie

Users Browsing this Thread

Op dit moment bekijken 1 gebruikers deze discussie. (0 leden en 1 gasten)

Regels voor berichten

  • Je mag geen nieuwe discussies starten
  • Je mag niet reageren op berichten
  • Je mag geen bijlagen versturen
  • Je mag niet je berichten bewerken
  •