Toon posts:

[php] rechten systeem

Pagina: 1
Acties:
  • 291 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Voor mijn eigen site ben ik bezig met het opzetten van een ledensysteem. Ik wil voor de verschillende leden ook een aparte status mogelijk maken. Nou is dat allemaal geen probleem en dat lukt ook nog. Waar ik nu mee zit is dat leden van een verschillende status ook verschillende dingen mogen doen op mijn site.

Mijn idee was om voor elke status een apart cijfer mee te geven en hoe belangrijker de user hoe hoger het cijfer. In code dus
code:
1
2
3
4
5
6
if ($statusnummer_user > x) {
  //code
}
else {
  //geen toestemming
}

Maar wat als je nu groepen wilt maken waarin de toestemmingen elkaar overlappen. Bijvoorbeeld een moderator op een forum en een nieuwsposter. Ze mogen hun afzonderlijke activiteiten wel uitvoeren maar niet die van elkaar. Of als er een nieuwe groep ingevoegd moet worden, dan schuift alles dus 1 nummer op. Hoe los ik dit nu op?

  • flat
  • Registratie: Mei 2000
  • Niet online
maak je ook gebruik van een database voor de users?

"Happiness is a way of travel, not a destination."
--Roy Goodman


Verwijderd

Topicstarter
Ja:

# phpMyAdmin MySQL-Dump
# http://phpwizard.net/phpMyAdmin/
#
# Host: localhost Database : Reizen
# --------------------------------------------------------

#
# Table structure for table 'users'
#

CREATE TABLE users (
id int(11) NOT NULL auto_increment,
name varchar(20) NOT NULL,
surname varchar(20) NOT NULL,
nickname varchar(20) NOT NULL,
password varchar(32) NOT NULL,
email varchar(25) NOT NULL,
website varchar(25) NOT NULL,
icq int(11) DEFAULT '0' NOT NULL,
msn varchar(25) NOT NULL,
datereg int(10),
interest text NOT NULL,
signature text NOT NULL,
showmail tinyint(4) DEFAULT '0' NOT NULL,
showname tinyint(4) DEFAULT '0' NOT NULL,
posts int(11) DEFAULT '0' NOT NULL,
lastpost date DEFAULT '0000-00-00' NOT NULL,
status int(11) DEFAULT '0' NOT NULL,
PRIMARY KEY (id)
);

//Titel is gemeld in SM, ben ik vergeten af te maken.

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 09-09 11:02
Als elke gebruiker een bepaalde activiteit wel of niet mag uitvoeren (en niets er tussen in), kun je gebruikmaken van bitfields die in getallen opgeslagen worden. Een voorbeeldje maakt 't waarschijnlijk wel duidelijk:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$NIEUWS_TOEVOEGEN     = 1<<1;
$NIEUWS_VERWIJDEREN   = 1<<2;
$FORUM_MODEREREN    = 1<<3;
$GEBRUIKERS_TOEVOEGEN = 1<<4;

...

$permissies["henk"]  = 0;
$permissies["jan"]   = $NIEUWS_TOEVOEGEN | $NIEUWS_VERWIJDEREN | $FORUM_MODEREREN;
$permissies["klaas"] = $GEBRUIKERS_TOEVOEGEN | $FORUM_MODEREREN;

...

if($permissies[$user] & $FORUM_MODEREREN)
{
  ... doe forum modereren ...
}
...

Etcetera. Op deze manier kun je dus per gebruiker aangeven wat ze wel en niet mogen. In principe moet je de waarden van je permissies (1<<1, 1<<2 oftewel 4, etcetera) van te voren vastleggen, want wijzigingen hierin betekent dat de permissies van de gebruikers ook bijgewerkt moeten worden.

Als je gebruik maakt van een database kun je natuurlijk ook een aparte tabel met permissies maken (soort, gebruiker) en daar per gebruiker zijn permissies aan toevogen. Met een simpele query (SELECT * WHERE gebruiker='henk' AND permissie='modereer forum') kun je dan verifieren dat een gebruiker bepaalde permissies heeft.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20:58

Janoz

Moderator Devschuur®

!litemod

ff topictitel iets verduidelijkt.

Wat je wilt doen is niet mogelijk met een userlevel. Wat je wel kunt doen is per forum een userlevel instellen. Op dat moment werk je dus niet met een level, maar met een array van levels. De key geeft bijvoorbeeld het forum of wat dan ook, en de waarde geeft aan wat de level is. Op die manier is het mogelijk dat je voor elke gebruiker op elk onderdeel een apparte level aan kunt geven.

In de DB kun je dit het beste opslaan dmv een koppeltabel met de velden onderdeelid, userid en level. Je zou de rechten array natuurlijk kunnen serializen en in 1 veld kunnen stoppen. Dit lijkt in eerste instantie makkelijk, maar voldoet niet aan de normaalvorm, en dat is al een teken dat je waarschijnlijk later tegen problemen aan gaat lopen.

Je zou deze oplossing ook nog iets aan kunnen passen door bepaalde groepen te maken. Een groep heeft bepaalde rechten, en de gebruiker kan lid zijn van 1 of meer groepen. Hierbij heb je ook een koppeltabel nodig, maar deze zal waarschijnlijk wel iets kleiner worden. Daarnaast is het beheer van de gebruikers een stuk makkelijker.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Ik doe het dus verkeerd om. Je moet niet uitgaan van een user maar dit per actie bekijken. Het beste is dus om er nog een tabel naast te zetten met het id en de verschillende groepen.

Zoiets:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# phpMyAdmin MySQL-Dump
# http://phpwizard.net/phpMyAdmin/
#
# Host: localhost Database : Reizen
# --------------------------------------------------------

#
# Table structure for table 'users_permission'
#

CREATE TABLE users_permission (
   id int(11) DEFAULT '0' NOT NULL,
   addnews tinyint(4) DEFAULT '0' NOT NULL,
   editnews tinyint(4) DEFAULT '0' NOT NULL,
   adduser tinyint(4) DEFAULT '0' NOT NULL,
   delnews tinyint(4) DEFAULT '0' NOT NULL,
   modforum tinyint(4) DEFAULT '0' NOT NULL,
   modforum2 tinyint(4) DEFAULT '0' NOT NULL
);

Dan tegelijk met het registreren van een user deze een rij geven in die tabel en alle toestemmingen op "0". Zodra ik wil dat hij iets meer mag deze op "1" zetten?

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
:X brak databasemodel :)

7 = 4 + 2 + 1 btw

Verwijderd

Topicstarter
Op maandag 29 april 2002 13:27 schreef Nielsz het volgende:
:X brak databasemodel :)

7 = 4 + 2 + 1 btw
Ik sta in voor suggesties. Ben ook maar een newbie. En wat bedoel je met dat laatste? :? Ben nu heel hard aan het denken wat wij ooit geleerd hebben over bits en wat ik daar nu mee moet doen. Ga even mijn boek zoeken.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op maandag 29 april 2002 13:31 schreef Xan het volgende:

[..]

Ik sta in voor suggesties. Ben ook maar een newbie. En wat bedoel je met dat laatste? :? Ben nu heel hard aan het denken wat wij ooit geleerd hebben over bits en wat ik daar nu mee moet doen. Ga even mijn boek zoeken.
Je hebt in je dbstaan: modforum1 modforum2.

Wat nu als je een derde forum erbij krijgt?
Wat dacht je van:
table rechten:
userid | forumid | recht

Elk recht geef je een int waarde. 1 = lezen, 2 = replyen, 4 = posten , 8 = closen, 16 = faqmaken

als recht = 7 dan mag je posten (4), replyen (2) en lezen (1)

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Nielsz:
7 = 4 + 2 + 1 btw
7 = 4 | 2 | 1 btw
want
7 = 1 + 1 + 1 + 1 + 1 + 1 + 1
en
1 = 1 | 1 | 1 | 1 | 1 | 1 | 1

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Maar dan krijg je toch nog dubbele rijen? Want een user kan voor elk forum een apart recht hebben? Dat is toch ook niet goed als je de regels van normalisatie gebruikt?

Ok, die bits snap ik nou :) Kon het niet vinden in de index.
7 = 4 | 2 | 1 btw
want
7 = 1 + 1 + 1 + 1 + 1 + 1 + 1
en
1 = 1 | 1 | 1 | 1 | 1 | 1 | 1
Het wordt wel duidelijker ;)

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op maandag 29 april 2002 13:39 schreef Xan het volgende:
Maar dan krijg je toch nog dubbele rijen? Want een user kan voor elk forum een apart recht hebben? Dat is toch ook niet goed als je de regels van normalisatie gebruikt?
En wat is daar niet goed aan?

drm: praat je nou weer hongaars :?

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Dus heb je per gebruiker maar 1 int nodig om al zijn rechten voor een bepaald forum weer te geven.

Rustacean


Verwijderd

Topicstarter
Ik heb een tijdje geleden het artikel op phpbuilder gelezen en daar werden ze allemaal uitgehaald. Maar nu ik nog eens kijk zie ik dat het daar ook niet helemaal gebeurd. Volgens mij kan ik weer aan de slag. Bedankt voor de (hele snelle :)) hulp!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Nielsz:
En wat is daar niet goed aan?
Niets :)

Xan haalt rijen en kolommen door elkaar.
Triviaal normaliseren: Ontwerp zo dat je zoveel mogelijk informatie in veel rijen opslaat, in plaats van veel kolommen ;)
drm: praat je nou weer hongaars :?
Als je dat niet begrijpt, val je me wel erg tegen.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op maandag 29 april 2002 13:56 schreef drm het volgende:
Als je dat niet begrijpt, val je me wel erg tegen.
Nielsz:
7 = 4 + 2 + 1
DRM:
7 = 4 | 2 | 1 btw
want
7 = 1 + 1 + 1 + 1 + 1 + 1 + 1
en
1 = 1 | 1 | 1 | 1 | 1 | 1 | 1
Nou haal je met je onderste 2 zinnen de bovenste toch weer onderuit :?

Verwijderd

Topicstarter
Mag ik dan wel in één tabel doen:

id | forumrecht1 | forumrechtx | websiterecht

Want in jullie voorbeeld heeft elk lid recht 2 nodig om te kunnen posten dus heeft het geen zin om een kolom te maken voor het forumid? En de website, voor dingen als nieuws posten, moet dan ook een apart recht hebben? Of is het slimmer om al die dingen op te tellen? Dan heb je maar 1 kolom en heel veel rekenwerk :?.

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op maandag 29 april 2002 14:01 schreef Xan het volgende:
Mag ik dan wel in één tabel doen:

id | forumrecht1 | forumrechtx | websiterecht
Wat zeg ik nou net over je derde forum wat je strax wil aanmaken?

Verwijderd

Topicstarter
Dan kan je toch een extra kolom invoegen?

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Xan:
Dan kan je toch een extra kolom invoegen?
* drm GA JE MOND WASSEN!

Da's nou precies wat je wilt voorkomen!
Nielsz:
Nou haal je met je onderste 2 zinnen de bovenste toch weer onderuit :?
Ik zal je een voorbeeldje geven:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
define ( "READ", 0x01 );
define ( "WRITE", 0x02 );

$wtf_R_thoserights = array (
   0x01 => "Read",
   0x02 => "Write"
);

$rights = READ + READ;
echo "User heeft plotseling " . $wtf_R_thoserights [ $rights ] . " rechten gekregen!";

$rights = READ | READ;
echo "User heeft " . $wtf_R_thoserights [ $rights ] . " rechten. Zoals ik zei.";

Dat voorkom je dan dus met een | operator.
(a + b) == (a | b)
gaat alleen maar op wanneer:
• a is niet gelijk aan b
• a is een gehele positieve macht van 2
• b is een gehele positieve macht van 2

snappie?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 20:58

Janoz

Moderator Devschuur®

!litemod

Op maandag 29 april 2002 13:35 schreef Nielsz het volgende:

Wat dacht je van:
table rechten:
userid | forumid | recht
Op maandag 29 april 2002 13:11 schreef Janoz het volgende:
......
In de DB kun je dit het beste opslaan dmv een koppeltabel met de velden onderdeelid, userid en level.........
:X :X

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Op maandag 29 april 2002 14:19 schreef drm het volgende:

[..]

/me GA JE MOND WASSEN!

Da's nou precies wat je wilt voorkomen!
Ok, ik snap gewoon nog steeds niet dat een tabel met straks het aantal users maal het aantal kolommen sneller is dan een tabel met x (aantal fora en website rechten) keer het aantal users maal 3 kolommen. Die laatste wordt in mijn ogen gewoon veel sneller groot. Maar het gaat niet om velden maar om kolommen? :7 Ik ga maar gewoon met jullie oplossing aan de slag :).

  • Nielsz
  • Registratie: Maart 2001
  • Niet online
Op maandag 29 april 2002 14:19 schreef drm het volgende:
Ik zal je een voorbeeldje geven:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
define ( "READ", 0x01 );
define ( "WRITE", 0x02 );

$wtf_R_thoserights = array (
   0x01 => "Read",
   0x02 => "Write"
);

$rights = READ + READ;
echo "User heeft plotseling " . $wtf_R_thoserights [ $rights ] . " rechten gekregen!";

$rights = READ | READ;
echo "User heeft " . $wtf_R_thoserights [ $rights ] . " rechten. Zoals ik zei.";

Dat voorkom je dan dus met een | operator.
(a + b) == (a | b)
gaat alleen maar op wanneer:
• a is niet gelijk aan b
• a is een gehele positieve macht van 2
• b is een gehele positieve macht van 2

snappie?
Yep, Je comprendre.

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Op maandag 29 april 2002 14:25 schreef Xan het volgende:
[..]
Ok, ik snap gewoon nog steeds niet dat een tabel met straks het aantal users maal het aantal kolommen sneller is dan een tabel met x (aantal fora en website rechten) keer het aantal users maal 3 kolommen. Die laatste wordt in mijn ogen gewoon veel sneller groot. Maar het gaat niet om velden maar om kolommen? :7 Ik ga maar gewoon met jullie oplossing aan de slag :).
Om dan snel te kunnen zoeken in de kolom, zal je op elke kolom een aparte index moeten leggen, wat betekent dat je database dus ook snel in grootte zal oplopen.

Bovendien gaat het hier minder om de snelheid maar om de onderhoudbaarheid. Want als je een forum erbij maakt , moet je je tabel aanpassen met een nieuwe kolom, je moet queries aanpassen zodat je er ook informatie uit die kolom kan halen e.d. De onderhoudbaarheid wordt gewoon slechter als je elke forum in een aparte kolom gaat zetten.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Topicstarter
Nog één ding, hoe ga ik nu controleren of een gebruiker de juiste waarde heeft. Als je namelijk veel groepen gaat maken worden dat steeds meer waardes. En dan wordt if (userstatus == x || X || xx) een beetje veel lijkt mij, komt er dan een enkele groep bij dan moet dit ook allemaal worden aangepast.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Xan:
[..]
wordt if (userstatus == x || X || xx) een beetje veel
[..]
  1. Het is de binary OR operator |, niet de logische OR ||
  2. Checken op userstatus doe je met &
Dit zijn de basics:
code:
1
2
3
4
5
Actie       Operator    Naam operator  Toepassing
------------------------------------------------------
Recht toekennen  |       OR      $rights |= RIGHT
Recht ontkennen  & ~       AND NOT    $rights &= ~RIGHT
Checken op recht &       AND        if ( $rights & RIGHT )

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Waar kan ik daar wat meer informatie over vinden of waar moet ik op zoeken want dit zegt me eigenlijk niks...

  • martinvw
  • Registratie: Februari 2002
  • Laatst online: 14-12-2025
hmm, op dit forum zijn dit soort dingen al vaker besproken dus probeer de search eens :-)

Verwijderd

of probeer me site eens ;) speciaal voor de topic starter heb ik de example die ik gekregen had en heb uitgewerkt toen ik ooit eens zoo'n vraag stelde online gezet :) inclusief code natuurlijk :)

http://members.lycos.nl/phpfreak/rights.php
PHP:
1
<?$theBits = array('USER_CAN_FORUM_POST' => 1,                 'USER_CAN_FORUM_EDIT' => 2,                 'USER_CAN_FORUM_MOVE' => 4,                 'USER_CAN_FORUM_DELETE' => 8,                 'USER_CAN_ADMIN_POST' => 16,                 'USER_CAN_ADMIN_EDIT' => 32,                 'USER_CAN_ADMIN_MOVE' => 64,                 'USER_CAN_ADMIN_DELETE' => 128);foreach($theBits as $theKey => $theVal) {      define($theKey, $theVal);}if ($submit == "calculate") {    if (isSet($FORUM_POST)) $theRights |= USER_CAN_FORUM_POST;    if (isSet($FORUM_EDIT)) $theRights |= USER_CAN_FORUM_EDIT;    if (isSet($FORUM_MOVE)) $theRights |= USER_CAN_FORUM_MOVE;    if (isSet($FORUM_DELETE)) $theRights |= USER_CAN_FORUM_DELETE;    if (isSet($ADMIN_POST)) $theRights |= USER_CAN_ADMIN_POST;    if (isSet($ADMIN_EDIT)) $theRights |= USER_CAN_ADMIN_EDIT;    if (isSet($ADMIN_MOVE)) $theRights |= USER_CAN_ADMIN_MOVE;    if (isSet($ADMIN_DELETE)) $theRights |= USER_CAN_ADMIN_DELETE;}elseif($submit == "clear"){    $theRights = 0;}elseif($submit == "check") {    $theRights = $number;}if ($theRights &amp; USER_CAN_FORUM_POST) { $FORUM_POST = "checked"; }if ($theRights &amp; USER_CAN_FORUM_EDIT) { $FORUM_EDIT = "checked"; }if ($theRights &amp; USER_CAN_FORUM_MOVE) { $FORUM_MOVE = "checked"; }if ($theRights &amp; USER_CAN_FORUM_DELETE) { $FORUM_DELETE = "checked"; }if ($theRights &amp; USER_CAN_ADMIN_POST) { $ADMIN_POST = "checked"; }if ($theRights &amp; USER_CAN_ADMIN_EDIT) { $ADMIN_EDIT = "checked"; }if ($theRights &amp; USER_CAN_ADMIN_MOVE) { $ADMIN_MOVE = "checked"; }if ($theRights &amp; USER_CAN_ADMIN_DELETE) { $ADMIN_DELETE = "checked"; }?><form method="post" action="<? echo $PHP_SELF; ?>"><table border="0" cellpadding="0" cellspacing="0" width="200">    <tr>        <td><table border="0" cellpadding="0" cellspacing="0"        width="100%">            <tr>                <td><strong><b>Forum rights</b></strong></td>            </tr>            <tr>                <td><table border="0">                    <tr>                        <td><input type="checkbox" name="FORUM_POST" value="ON" <? echo $FORUM_POST; ?>></td>                        <td>Add / Post</td>                    </tr>                    <tr>                        <td><input type="checkbox" name="FORUM_EDIT" value="ON" <? echo $FORUM_EDIT; ?>></td>                        <td>Edit</td>                    </tr>                    <tr>                        <td><input type="checkbox" name="FORUM_MOVE" value="ON" <? echo $FORUM_MOVE; ?>></td>                        <td>Move</td>                    </tr>                    <tr>                        <td><input type="checkbox" name="FORUM_DELETE" value="ON" <? echo $FORUM_DELETE; ?>></td>                        <td>Delete</td>                    </tr>                </table>                </td>            </tr>        </table>        </td>    </tr></table><br><table border="0" cellpadding="0" cellspacing="0" width="200">    <tr>        <td><table border="0" cellpadding="0" cellspacing="0"        width="100%">            <tr>                <td><strong><b>Admin rights</b></strong></td>            </tr>            <tr>                <td><table border="0">                    <tr>                        <td><input type="checkbox" name="ADMIN_POST" value="ON" <? echo $ADMIN_POST; ?>></td>                        <td>Add / Post</td>                    </tr>                    <tr>                        <td><input type="checkbox" name="ADMIN_EDIT" value="ON" <? echo $ADMIN_EDIT; ?>></td>                        <td>Edit</td>                    </tr>                    <tr>                        <td><input type="checkbox" name="ADMIN_MOVE" value="ON" <? echo $ADMIN_MOVE; ?>></td>                        <td>Move</td>                    </tr>                    <tr>                        <td><input type="checkbox" name="ADMIN_DELETE" value="ON" <? echo $ADMIN_DELETE; ?>></td>                        <td>Delete</td>                    </tr>                </table>                </td>            </tr>        </table>        </td>    </tr></table><br><p><input type="submit" name="submit" value="calculate"> - <input type="submit" name="submit" value="clear"></p><p><input type="text" size="20" name="number" value="<? echo $theRights; ?>"></p><p><input type="submit" name="submit" value="check"></p></form>?>

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

Op maandag 29 april 2002 13:27 schreef Nielsz het volgende:
:X brak databasemodel :)

7 = 4 + 2 + 1 btw
[topic=356022/1/100] :+

Doet iets met Cloud (MS/IBM)


Verwijderd

Op woensdag 01 mei 2002 20:18 schreef D2k het volgende:

[..]

[topic=356022/1/100] :+
6 = (3 = bestaat niet) + 2 + 1 :) oftwel alleen 2 & 1

Verwijderd

Topicstarter
/me vraagt zoch af waar die berg code voor dient?

Na wat zoekwerk en uitpoberen snap ik hoe ik de code moet controleren. Uit de database haal je het recht van de user ($user_recht) en dit vergelijk je met het recht wat hij wil gaan uitvoeren ($recht_nodig) door middel van "&".
PHP:
1
<? if($user_recht &amp; $recht_nodig) {    //code voor het uitvoeren}else {    //foutmelding}?>

Waarom wordt er in elk topic dan gerommeld met arrays? De rechten voor het lezen, posten en dergelijke kunnen toch ook al van te voren vaststaan en zelfs eventueel uit een database worden gehaald?

  • Access
  • Registratie: Juni 2001
  • Laatst online: 06-08 19:54
Op woensdag 01 mei 2002 20:56 schreef Xan het volgende:
Waarom wordt er in elk topic dan gerommeld met arrays? De rechten voor het lezen, posten en dergelijke kunnen toch ook al van te voren vaststaan en zelfs eventueel uit een database worden gehaald?
Ja, ze kunnen van te voren vaststaan, en ja ze kunnen ook in een DB zitten. Alleen het is veel makkelijker om 1 getal (je rechten dus) in een DB op te slaan, dan voor elk recht een apart veld aan te moeten maken bij een user.

b.v.:
(user_id, rights, user_name)
1, 7, 'Access'

i.p.v.
(user_id, can_post, can_edit, can_moderate, user_name)
1, yes, yes, no, 'Access'

Zoals je ziet is manier 1 dus een stuk korter/beter. Snap je het nu een beetje ?

Verwijderd

Topicstarter
Ja dat snapte ik wel al maar ik bedoelde meer dit stuk:
PHP:
1
<?$theBits = array('USER_CAN_FORUM_POST' => 1,                       'USER_CAN_FORUM_EDIT' => 2,                       'USER_CAN_FORUM_MOVE' => 4,                       'USER_CAN_FORUM_DELETE' => 8,                       'USER_CAN_ADMIN_POST' => 16,                       'USER_CAN_ADMIN_EDIT' => 32,                       'USER_CAN_ADMIN_MOVE' => 64,                       'USER_CAN_ADMIN_DELETE' => 128);?>

Dit hoeft toch niet? Of kom je echt vast te zitten als je zoiets niet doet? Arrays zijn voor mij namelijk nog erg onduidelijk :'(.

  • Access
  • Registratie: Juni 2001
  • Laatst online: 06-08 19:54
Het hoeft niet. Je kan ook ze ook telkens appart definieren (en niet met dat loopje).
PHP:
1
<?define('USER_CAN_FORUM_POST', 1);define('USER_CAN_FORUM_EDIT', 2);define('USER_CAN_FORUM_MOVE', 4);//etc?>

Verwijderd

Topicstarter
Maar dan maak je nog steeds gebruik van arrays. Ook gebruik je dingen die je eigenlijk niet nodig hebt. Bijvoorbeeld een mod wil een topic sluiten. In de database wordt de waarde die bij deze user hoort gehaald, het script voor het sluiten heeft al een vaste waarde en die kan je toch gewoon controleren? Wat is dan het nut van die array? Dat is toch overbodige code?

  • Access
  • Registratie: Juni 2001
  • Laatst online: 06-08 19:54
Ik maak bij de bovenstaande code geen gebruik van arrays. Ik definieer constantes.

Maar wat jij zegt over een topic sluiten ontgaat me een beetje, want het lijkt mij toch het meest logische dat je DB/table er ongeveer zo uitziet (e.v.t nog extra attributen):

topic_id, topic_name, topic_locked

En topic_locked zet je gewoon op '1' of 'true' oid, en in je php code kijk je dan of topic_locked op '1' staat of niet. Zo ja, dan mag je dus niet posten en editen in het topic, zo niet, dan mag je dat dus wel :).

Verwijderd

Topicstarter
Ja ok :). Ik ga mijn 'constantes' uit een database halen omdat dat makkelijker aan te passen is lijkt me. En dat is voor users ook makkelijker om hun status aan te passen als daar iets in mocht veranderen. Anders is het in al die files de constantes veranderen en de status van al die users.

Maar ik ga er eens mee aan de slag :). Thnx!

  • Access
  • Registratie: Juni 2001
  • Laatst online: 06-08 19:54
Je kan ook een php bestandje maken met al die constantes erin, en die bij elk php script includen (idee?). Althans zo doe ik het. Maarja dat moet je zelf maar ff bekijken.

Verwijderd

Topicstarter
Is misschien beter, in ieder geval makkelijker en sneller dan telkens select statements. Maar waarom met define? $close = 4; zou toch ook al werken?

  • SJR
  • Registratie: Januari 2000
  • Laatst online: 15-02 13:58

SJR

hmm.... 'k heb niet het hele topic gelezen, over permissions met bits enzo. ' t Kan een oplossing zijn, maar ik heb het anders (en heel simpel ook, en genormaliseerd). Ik dump hier wel ff mijn db layout, hopelijk begrijp je dan hoe je het beste relatie's tussen tables kan leggen, en dan vooral n-to-n relaties:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#
# Table structure for table `permission`
#
CREATE TABLE permission (
  permissionID int(11) NOT NULL auto_increment,
  name varchar(50) NOT NULL default '',
  PRIMARY KEY  (permissionID),
  KEY permissionID (permissionID)
) TYPE=MyISAM;
#
# Dumping data for table `permission`
#
INSERT INTO permission (permissionID, name) VALUES (1, 'editProduct');
INSERT INTO permission (permissionID, name) VALUES (2, 'editProductGroup');
INSERT INTO permission (permissionID, name) VALUES (3, 'editUser');
INSERT INTO permission (permissionID, name) VALUES (4, 'editSpecificationField');
INSERT INTO permission (permissionID, name) VALUES (5, 'admin');
INSERT INTO permission (permissionID, name) VALUES (6, 'editAdmin');
INSERT INTO permission (permissionID, name) VALUES (7, 'editPaymentMethod');
INSERT INTO permission (permissionID, name) VALUES (8, 'editShippingMethod');
INSERT INTO permission (permissionID, name) VALUES (9, 'editOrder');
INSERT INTO permission (permissionID, name) VALUES (10, 'editImage');

    



    


# 'k ga je natuurlijk geen dump van m'n admintable geven, username's, tel nummers en (gehashde) wachtwoorden erin
#
# Table structure for table `admin`
#
CREATE TABLE admin (
  adminID int(11) NOT NULL auto_increment,
  email varchar(50) NOT NULL default '',
  password varchar(32) NOT NULL default '',
  firstname varchar(50) NOT NULL default '',
  lastname varchar(50) NOT NULL default '',
  PRIMARY KEY  (adminID),
  KEY userID (adminID)
) TYPE=MyISAM;

    




#
# Table structure for table `admin_permission`
#
CREATE TABLE admin_permission (
  adminID int(11) NOT NULL default '0',
  permissionID int(11) NOT NULL default '0'
) TYPE=MyISAM;
#
# Dumping data for table `admin_permission`
#
INSERT INTO admin_permission (adminID, permissionID) VALUES (2, 4);
INSERT INTO admin_permission (adminID, permissionID) VALUES (1, 4);
INSERT INTO admin_permission (adminID, permissionID) VALUES (2, 8);
INSERT INTO admin_permission (adminID, permissionID) VALUES (2, 2);
INSERT INTO admin_permission (adminID, permissionID) VALUES (2, 1);
INSERT INTO admin_permission (adminID, permissionID) VALUES (2, 7);
INSERT INTO admin_permission (adminID, permissionID) VALUES (2, 9);
INSERT INTO admin_permission (adminID, permissionID) VALUES (2, 10);
INSERT INTO admin_permission (adminID, permissionID) VALUES (3, 10);
INSERT INTO admin_permission (adminID, permissionID) VALUES (3, 5);
INSERT INTO admin_permission (adminID, permissionID) VALUES (1, 8);
INSERT INTO admin_permission (adminID, permissionID) VALUES (2, 6);
INSERT INTO admin_permission (adminID, permissionID) VALUES (2, 5);
INSERT INTO admin_permission (adminID, permissionID) VALUES (1, 2);
INSERT INTO admin_permission (adminID, permissionID) VALUES (1, 1);

hier kan elke admin dus elke premissie hebben, en elke permissie kan elke admin hebben, een zogenaamde veel-opveel relatie.

Met de volgende query haal ik dan de permissions op bij een user:
code:
1
2
3
4
5
select p.name
        from permission as p
        inner join admin_permission as ap on
        ap.adminID='$adminID' and
        ap.permissionID=p.permissionID

(btw, kan zijn dat deze query nog niet helemaal geoptimaliseerd is, zit nog in de beta fase)

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 23:30
Op woensdag 01 mei 2002 20:22 schreef xtentic het volgende:
6 = (3 = bestaat niet) + 2 + 1 :) oftwel alleen 2 & 1
|:(

6 = 4 + 2

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

ddc:
|:(

6 = 4 + 2
:Z
6 = 4 | 2
;)
SJR:
[Ook een manier]
Alleen apart dat admin een tabel is, en niet een eigenschap van een user :?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Op donderdag 02 mei 2002 07:27 schreef ddc het volgende:

[..]

|:(

6 = 4 + 2
:D :D :D Oepsie :D

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 23:30
Op vrijdag 03 mei 2002 06:43 schreef xtentic het volgende:
:D :D :D Oepsie :D
Hele grote oeps ja :{

  • SJR
  • Registratie: Januari 2000
  • Laatst online: 15-02 13:58

SJR

Op donderdag 02 mei 2002 09:43 schreef drm het volgende:
Alleen apart dat admin een tabel is, en niet een eigenschap van een user :?
Ja, klopt, dat was ook niet mijn idee oorspronkelijk. Logischer is om gewoon een usertable te hebben, en dat je dat aan elke user permissions kan geven. Maar dat wilde m'n opdrachtgever liever niet, hij wilde user en admin compleet gescheiden houden.

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

SJR:
Ja, klopt, dat was ook niet mijn idee oorspronkelijk. Logischer is om gewoon een usertable te hebben, en dat je dat aan elke user permissions kan geven. Maar dat wilde m'n opdrachtgever liever niet, hij wilde user en admin compleet gescheiden houden.
sry voor de kick, ben een weekeindje uit de roulatie geweest ;)

Maar hier wil ik nog wel eventjes op reageren:
User permissions zijn juist de scheiding tussen admins en users. Als je er verschillende tabellen voor gaat maken, maak je het jezelf veel moeilijker dan het is.

En als de opdrachtgever dat toch niet wil, dan moet je hem dat maar even uitleggen, dat het je dan allemaal veel meer tijd kost, tragere queries gaat maken, of zelfs meer dan nodig is, etc....

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • SJR
  • Registratie: Januari 2000
  • Laatst online: 15-02 13:58

SJR

Op maandag 06 mei 2002 09:37 schreef drm het volgende:
Maar hier wil ik nog wel eventjes op reageren:
User permissions zijn juist de scheiding tussen admins en users. Als je er verschillende tabellen voor gaat maken, maak je het jezelf veel moeilijker dan het is.
My arguments exactly, tov de opdrachtgever dan... Maar er zit ook wel een stukje extra beveiliging in zo. Nu kan een admin niet per ongeluk een (verkeerde) user ineens permissies geven. En een nieuwe admin kan zich niet zomaar registreren, die moet worden aangemaakt door een andere admin. Bovendien zijn in dit systeem users niet echt gebruikers van een site, maar klanten van een webshop.
Begrijp me niet verkeerd, ik vind het in principe ook onlogisch om een aparte admin table te maken, maar in dit geval heb ik het toch gedaan.
En als de opdrachtgever dat toch niet wil, dan moet je hem dat maar even uitleggen, dat het je dan allemaal veel meer tijd kost, tragere queries gaat maken, of zelfs meer dan nodig is, etc....
Euh... het kost mij niet echt veel meer tijd hoor, een extra table is zo gemaakt. Tragere queries? Dat lijkt me juist niet. Ten eerste vanaf de user kant: als een user inlogt hoeft het systeem niet de user_permission en permission table door te spitten. Ten tweede vanaf de admin kant: als een admin inlogt dan is de table om een admin uit te selecten een stuk minder groot dan de user table... volgens mij gaat't dan ook sneller.
Pagina: 1