the Hellboard (http://old.the-hellboard.de/index.php)
- Computer und Co (http://old.the-hellboard.de/board.php?boardid=10)
--- Software (http://old.the-hellboard.de/board.php?boardid=12)
---- Coder Forum (http://old.the-hellboard.de/board.php?boardid=90)
----- PHP: Zugriffsrechte (http://old.the-hellboard.de/thread.php?threadid=4455)


Geschrieben von stanny am 27.08.2005 um 00:59:

  PHP: Zugriffsrechte

Hallo.
Ich arbeite derzeit an einer Galerie, die mit einem Gruppen-Script harmoniert.
Nun ist die Frage, wie ich die Benutzerrechte (mySQL) speichern sollte.

Sollte ich für jede Galerie eine neue Spalte in der Tabelle der Benutzerrechte machen?

Beispiel:

code:
1:
2:
3:
4:
5:
6:
7:
8:
CREATE TABLE `hphp0_grps`
  (`ID` INT PRIMARY KEY AUTO_INCREMENT,
   `name` VARCHAR(255),
   `password` VARCHAR(255),
   [...]
   `galerie0_canUploadPic` TINYINT(1) DEFAULT 0,
   `galerie0_canDeletePic` TINYINT(1) DEFAULT 0,
   [...]);


Oder sollte ich in der Tabelle der Galerie die IDs der Benutzergruppen speichern, welche Bilder hochladen etc. können? Wenn ja, gibt es irgendeine Art Array-Variable?

Falls ja und nein ( (-; ): Sollte ich dann eine Art Array selber schreiben, indem ich noch eine Tabelle anlegen, in denen die Benutzerrechte und -gruppen der Galerie gespeichert werden und daraus ein Array erstellen?

Oder habt ihr eine ganz andere Idee?

Bitte schnell um Antwort.

Danke (-:



Geschrieben von SirBelial am 27.08.2005 um 12:20:

 

http://mysql.com/set



Geschrieben von Hamster am 27.08.2005 um 12:21:

 

Bin zwar kein EXperte in Sachen php, aber ich würde sagen wenn du genug Datenbanken anlegen kannst würde ich alles in eine tabelle rein schreiben, und mir nicht die Mühe mit dem Array amchen.



Geschrieben von stanny am 27.08.2005 um 12:37:

 

Zitat:
Original von Lord Belial
http://mysql.com/set


Verstehe ich nicht ganz. Wie kann ich da Zahlen speichern?



Geschrieben von MoD3000 am 27.08.2005 um 12:37:

 

Wie Beli bereits andeutete: Die letztere Variante skaliert.
Etwas Platzverschwendung mal beiseite faende ich zwei Tabellen 'create_gal' & 'del_gal' gut, in denen jede Zeile eine Gruppe mit einer Galerie verknuepft. Das laesst sich einfacher durchsuchen.



Geschrieben von stanny am 27.08.2005 um 14:53:

 

Also du sprichst davon, jede Galerie eine (bzw. 3, 4) Spalte(n) in die Tabelle der Benutzergruppen anzulegen?



Geschrieben von MoD3000 am 27.08.2005 um 15:22:

 

Nein.
code:
1:
2:
3:
4:
CREATE TABLE `create_gal` (`gallery_id` [SMALL]INT, `group_id` [SMALL]INT)
CREATE TABLE `del_gal` LIKE `create_gal`

Einfach, vielleicht gibts auch was besseres.



Geschrieben von Arudil am 27.08.2005 um 16:07:

 

Ich hab Benutzerrechte mit Bitweisen Verknüpfungen gelöst. Das ist zum einen übersichtlich und zum anderen extrem Platzsparend:

code:
1:
2:
3:
4:
5:
//config.php
define ("P_LOGIN", 1);
define ("P_UPLOAD", 2);
define ("P_POSTNEWS", 4);
define ("P_ADMIN", 8);


P steht für Privileg, einfach damit ich weiß was Sache ist, wenn ich die Konstante irgendwo seh.
P_LOGIN sagt dann darüber etwas aus, ob der User einloggen darf. Darf er einloggen, wird der Wert (1) gesetzt.
Darf der User News posten ("P_POSTNEWS"), wird zusätzlich der Wert 4 gesetzt.
Darf der User nichts hochladen, wird der Wert (2) für P_UPLOAD nicht gesetzt.
Rechnen wir nun die Werte zusammen, kommen wir auf 1+4=5.
Damit kann man dann später prüfen was der User darf.
Jetzt wirst du dich evtl fragen: "Aber wartmal 2+3 ist auch 5". Stimmt schon, aber es gibt keinen Wert 3, genausowenig wie es einen Wert 5 gibt.

Das Prüfen der Rechte geht ziemlich einfach:

code:
1:
2:
3:
4:
5:
6:
7:
if ($variable & P_UPLOAD) {
doupload();
}else{
echo "Zugang verweigert";
}



Geschrieben von stanny am 27.08.2005 um 16:52:

 

Das wird bei mir leider nicht realisierbar sein, da ich ein Basis-Script habe, welches mit beliebig vielen Plugins erweitert werden kann. Somit wäre es ein Problem, wenn das Galerie Script mit der Berechtigung "4" arbeitete und das Blog Script auch.

edit: Ach, jetzt versteh ich, was du meinst, Mod.

Jetzt wo ich länger drüber nachdenke, kommt mir meine Anfangslösung aber dennoch zunehmend gut vor. Und zwar, dass jede Galerie einfach ca. 5 (Erstellen, Löschen, Bearbeiten, Bild hochladen, Bild löschen) Spalten in der Benutzertabelle vornimmt.

Dagegen spricht allerdings, dass die Tabelle der Benutzergruppen schnell sehr groß wird.
Nehmen wir an, ich habe nur 5 Galerien, so hat die Tabelle der Benutzergruppen schon 25 Spalten mehr.

Dafür spricht, dass ich die Abfrage durch diese Funktion vereinfachen und globalisieren kann.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
function getusrright ($str) {
    if (!$_SESSION['logdIn'])
        return false;
    global $sql, $scriptnr;
    $sql->queryDb('SELECT `grpID` FROM `hphp'.$scriptnr.'_users` WHERE `ID` = '.$_SESSION['userID'].';');
    if (!$sql->getErr()) {
        $row = $sql->fetchRow();
        $sql->queryDb('SELECT `'.$str.'` FROM `hphp'.$scriptnr.'_groups` WHERE `ID` = '.$row[0].';');
        if (!$sql->getErr()) {
            $row = $sql->fetchRow();
            return (bool)$row[0];
        }
    }
    return -1;
}


Ist es nun ein Problem, Tabellen mit 100 oder sogar mehr Spalten zu haben (andere Plugins werden ja nach demselben Prinzip handeln)?

edit:

Ich habe mich nochmal mit Knolle unterhalten und tendiere nun stark zu MODs Variante.
Allerdings werde ich wohl eine Tabelle für die Rechte nehmen:

code:
1:
2:
3:
4:
5:
6:
7:
8:
CREATE TABLE `gal_usrright`
	(`grpID` INT,
	 `canCrtGal` TINYINT(1) DEFAULT 0,
	 `canDelGal` TINYINT(1) DEFAULT 0,
	 `canEdiGal` TINYINT(1) DEFAULT 0,
	 `canUplPic` TINYINT(1) DEFAULT 0,
	 `canDelPic` TINYINT(1) DEFAULT 0,
	 `canEdiPic` TINYINT(1) DEFAULT 0);

So in etwa. Dann muss ich zwar für jedes Script eine Funktion zum Abfragen schreiben, aber egal. (-:

Noch jemand Einwände?



Geschrieben von MoD3000 am 27.08.2005 um 19:38:

 

Wenn du die Tabellen ordentlich benennst, kannst du dir eine Funktion basteln, die die Anderungen vornimmt und du hast keine Code-duplikation



Geschrieben von stanny am 28.08.2005 um 02:23:

 

Hab ich mir auch überlegt, sie übernimmt einfach einen zweiten optionalen Parameter, der die Tabelle angibt. Wird nichts angegeben, wird die Standardtabelle ausgelesen. Fertig.

Vielen Dank euch allen. (-:


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH