Binäres Rechtesystem

  • Themenstarter Themenstarter Bgag
  • Beginndatum Beginndatum
Hi,

da du mit mysqli arbeitest liegt es wohl an folgendem:

MySqli liefert als Ergebnis ein Object vom Typ Mysqli_result zurück.
Wenn du per $result->fetch_assoc() auf das Result Object zurückgreifst, wird nur das erste Ergebnis aus dem Objekt gezogen.

Möglich wäre
PHP:
// same perms to array
$ids = array();
WHILE($row = $result->fetch_assoc()) {
   $ids[] = $row['id'];
}
Bei der delMod() Methode kann ich auf den ersten Blick keinen Fehler finden. Was geht denn genau nicht? Wird der Eintrag nicht gelöscht? Gibts nen Warning? Schonmal debugged ob der geparste SQL String (echo $sql) auch korrekt ist (z.b. mal in phpmyadmin testen)
Wenn ein Fehler im SQL ist ist $this->db->affected_rows == -1, würde prüfen ob es -1 (fehler in SQL) oder 0 ist (keine betroffenen Zeilen). Eventuell den Fehler per var_dump($this->db->error); ausgeben lassen nach dem ausführen von $this->db->query($sql);
 
Dank deiner Hilfe konnte ich nun den Fehler in der Methode getMods() behen. Zudem konnte ich herausfinden, dass der Fehler der Methode delMod() garnicht in dieser Methode, sondern in der Methode getId() liegt. Wo dort allerdings der Fehler versteckt ist weiß ich leider selbst nicht, allerdings gibt die Methode nicht, wie gewünscht eine ID zurück.
MfG, Andy

//EDIT: Leider fällt mir gerade auch auf, dass ich keine Benutzer via addUser() erstellen kann. Kann mir jemand sagen, woran das liegt? Ich bekomme auch keinen Fehler. Er wird einfach nicht in die Datenbank eingetragen.
 
Zuletzt bearbeitet von einem Moderator:
Hallo!
Also erstes möchte ich mich für das doppelte Posting und das freudengeladene Blabla, das nun folgen wird entschuldigen. Des weiteren möchte ich mich bei den fleißigen Helfern nochmals bedanken. Die Klasse ist nun (in ihrem jetzigen Status) fehlerfrei. Nun ist natürlich die Frage, ob das alles so ausreichend ist. Darum würde mich nun interessieren, welche Methoden ihr in einer Klasse zur Rechte und Benutzerverwaltung noch missen würdet. Die folgenden Methoden sind bisher implementiert worden.

Übersicht über die Methoden
__construct() - Setzt die wichtigen Variablen
addMod() - Fügt einen geschützten Bereich hinzu
delMod() - Entfernt einen geschützten Bereich
getMods() - Gibt die Daten aller geschützter Bereiche zurück (Id, Name)
getPerms() - Gibt die IDs zu den Bereichen zu denen ein Benutzer Zutritt besitzt zurück
addUser() - Fügt einen Benutzer hinzu
check() - Überprüft die Zutritts-Berechtigung eines Nutzers
getId() - Gibt die ID zu einem Bereich oder einem Nutzer anhand der ID oder des Namens zurück

Die Letzte Methode erscheint auf den ersten Blick sehr unsinnig, ist aber sehr praktisch. Sie ermöglicht es, dass man zum Beispiel beim Aufruf der Methode check entweder den Namen oder die Id eines Nutzers übergeben kann und dass man den Namen oder die Id eines geschützten Bereichs übergeben kann. So wird dem Nutzer die Arbeit erleichtert.

Ich würde mich also über Rückmeldungen und vorallem Anregungen freuen.
MfG, Andy
 
Zuletzt bearbeitet von einem Moderator:
Hi,

interessant wäre nochmal der aktualisierte Quellcode der Klasse.
Habe mich mal an dem letzten geposteten Quellcode gehalten, da fällt mir auf, das ich nicht wüsste, wie ich einem Benutzer die Berechtigungen für einen Bereich zuweisen kann.
Beispiel:
- Ich kann User adden mit direktem "perm" wert
- Ich kann nur einen Bereich im ModTable adden

Wie kann ich nun einem User Zugriff auf diesen neuen Bereich gewähren? (editUser ?)
Und wie ist das, wenn ein Bereich via delmod() gelöscht wird? Werden dann auch die "perm" Werte in der Usertabelle der user aktualisiert die da mal zugriff hatten?

Soweit erstmal, schau nochmal drüber wenn mehr zeit da ist
 
Du hast Recht da fehlt noch was. Ich werde gleich mal drei weitere Methoden hinzufügen. Eine editUser()-Methode zum ändern der Benutzer-Daten, eine calcPerms()-Methode zum errechnen der neuen Rechte anhand eines Arrays, dass die Ids der zugriffsberechtigten Bereiche enthält, und eine Methode getUser(), die alle gespeicherten Daten eines Benutzers zurück gibt.

Zu deiner Frage ob ich die Permissions eines Users update, wenn ein Bereich gelöscht wird kann ich nur sagen - Nein. Wieso auch? Es ändert sich ja nichts dadurch. Das wird automatisch gemacht, Fügt man neue Rechte hinzu oder nimmt ihm welche.

Wie seht ihr das eigentlich mit dem Exception-Handling? Haltet ihr das in einer solchen Klasse für angebracht oder soll ich in einer solchen Klasse lieber mit Rückgabewerten arbeiten?

Den aktuellen Quellcode und eine SQL-Query zum Testen habe ich mal angehängt.
MfG, Andy

Die SQL-Datei zum testen, damit ihr nicht so viel Stress habt.
Code:
CREATE TABLE `permissions` (
  `id` tinyint(4) NOT NULL auto_increment,
  `name` varchar(30) NOT NULL default '',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=0;

INSERT INTO `permissions` VALUES (1, 'settings');
INSERT INTO `permissions` VALUES (2, 'articles');

CREATE TABLE `user` (
  `id` tinyint(4) NOT NULL auto_increment,
  `name` varchar(20) NOT NULL default '',
  `password` varchar(32) NOT NULL default '',
  `email` varchar(60) NOT NULL default '',
  `perm` tinyint(3) unsigned NOT NULL default '0',
  PRIMARY KEY  (`id`)
  UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=0;

INSERT INTO `user` VALUES (1, 'avedo', 'ddd6acc47c23379394ee7cdcbb4ea22b', 'andreas2209@web.de', 30);
INSERT INTO `user` VALUES (2, 'klaus', '0f5f53ea8fe0e8eeb72db72b47ddf351', 'klaus@avedo.net', 14);
 
Zuletzt bearbeitet von einem Moderator:
Guten Abend!
Ich habe die drei Methoden calcPerms(), editUser() und getUser() nun hinzugefügt, auch wenn ich gestehen muss, dass ich sie bisher noch nicht testen konnte. Dies werde ichaber noch nachholen.Nun ist es allerdings relativ einfach möglich die Zugriffsrechte eines Nutzers zu ändern. Als erstes holt man sich mit getMods() alle existierenden Bereiche und dann mit getPerms() die Ids zu den Bereichen, zu denen der bearbeitete Nutzer momentan Zugriffsrechte besitzt. Nun gibt man für alle Bereiche eine Checkbox aus, wobei man mit in_array() überprüft, ob der Benutzer zum Zeitpunkt des erstellens der Checkboxen die Zugriffsrechte zu diesem Bereich besitzt. Ist dies der Fall wird die Checkbox als checked erstellt. nach der Ausgabe sind nun also für alle geschützten Bereiche erstellt worden, wobei die zu denen der Nutzer Zugriffsrechte besitzt makiert sind. Nun kann man die Zugriffsrechte durch markieren der Checkboxen beliebig ändern. Nach dem Absenden des Formulars steht also ein Array mit den Ids der Bereiche, zu denen der Benutzer zukünftig Zugriff haben soll, zur Verfügung. Mit der Methode calcPerms() errechnet man nun den binären Wert, der in die Spalte permissions in die Benutzer-tabelle eingetragen werden soll. Dies geschieht dann über die Methode editUser(), der man einfach alle zu ändernden Felder und ihre zugehörigen Values übergibt.

Ich hoffe, dass dies deine Frage bezüglich der Eintragung neuer Rechte für einen User beantwortet, Mairhofer.

Wie gesagt, werde ich die drei neuen Methoden sobald es mir möglich ist noch testen. Vielleicht möchte es aber auch noch jemand anderes versuchen und mir eine Rückmeldung geben. Ich würde mich sehr freuen.
MfG, Andy

//EDIT: Werde noch die Methode delUser() hinzufügen. calcPerms() und getUser() funktionieren hervorragend. editUser() muss ich noch überarbeiten.

//EDIT: delUser() wurde hinzugefügt!
 
Zuletzt bearbeitet von einem Moderator:
Steinaltes Thema aber ich möcht einfach mein Senf dazu geben :)

Wenn ich mal eine Rechteverwaltung auf binärer Basis mache dann definiere ich mir ein paar Sachen (damit der Code übersichtlich bleibt, auch für andere):

PHP:
define('WRITE_FLAG', 8);
define('DELETE_FLAG', 4);
define('EDIT_FLAG', 2);
define('READ_FLAG', 1);

und dazu - weil es performativer ist als alles andere - die if:

PHP:
if (($rights & WRITE_FLAG) == WRITE_FLAG) echo "schreibrechte";

if (($rights & DELETE_FLAG) == DELETE_FLAG) echo "löschrechte";

if (($rights & EDIT_FLAG) == EDIT_FLAG) echo "bearbeitungs... das wort gibt's nicht oder?";

if (($rights & READ_FLAG) == READ_FLAG) echo "lesen - mehr nich";

Vielleicht hilft dir das Catull deine Klasse etwas zu beschleunigen. Hab sie nur schnell überflogen und diese Bit-Operatoren nicht gesehen.
Das ändern der Rechte ist ja auch einfach. Das Ergebnis eines binären Oders zweier Rechte fügt diese beiden zusammen und (wenn ich nicht irre) kann man durch ein Exklusives Oder ein Recht wieder entfernen.
 
Zuletzt bearbeitet:
Ich muss gestehen, dass ich deinen Einwand nicht im geringsten verstehe. Die von mir geschriebene Klasse beschäftigt sich mit ein paar mehr Rechten, als nur Lesen, Schreiben und Ausführen. Zudem können durch AddOns neue geschützte Bereiche hinzukommen. Daher macht es nur wenig sinn Konstanten zu definieren. Außerdem können über diese Klasse auch die Benutzer verwaltet werden. Die Bit-Operatoren kommen in der Methode check() ziemlich am Ende der Klasse zum Einsatz.
MfG, Andy
 
Die Konstanten waren nur als Beispiel / zum Verdeutlichen.

(ich hab ein deutsch heute drauf...:confused: )

Und da ich dachte das du auch ein Fan der Performance bist, hab ich mal bisschen was geschrieben. Is Freitagabend, die Doppelkopfrunde is grad vorbei und das Bier is alle ^ ^ was soll ich sonst tun? :D Langeweile... ;)

Die Operatoren am Ende der Klasse hab ich wohl übersehen.
Aber im Moment überlege ich ob man die do-Schleife in Permissions::getPerms vielleicht schneller machen kann indem man nicht $i und ein pow benutzt sondern eine Verschiebung (>>) i-wie nutzt.

Eigentlich sollte ich auch besser pennen gehen :P
Jut Nacht.

PS - Nur ne Idee - bin zu voll um zu gucken ob das klappt:
PHP:
$i = 1;
do
        {
            if( ($perm & $i) = $i )
            {
                $mods[] = $i;
            }
            $i <<= 1;
        }
        while( $perm >= $i );
 
Zuletzt bearbeitet:
Zurück