| | | | |
| |||||||
| PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen |
|
| | LinkBack | Themen-Optionen | Thema bewerten |
| | |
| Erfahrener Benutzer Registriert seit: 06.09.2008
Beiträge: 189
![]() | Hallo! Ich bin neu hier im Forum. Ich wurde von einem anderen Nutzer auf dieses Forum aufmerksam und war sofort begeistert von den regen Diskussionen hier. Großes Kino! Ich möchte euch eine Klasse vorstellen, die ich geschrieben habe, um Zugriffsrechte und Benutzer besser verwalten zu können. Für diese Klasse suche ich Tester und Leute, die ein paar Verbesserungsvorschläge einbringen. Zudem überlege ich anstatt auf Exceptions zurück zu greifen auf return true & false oder auf eine log()-Methode setzen soll. Was haltet ihr davon? Im nachfolgenden erkläre ich noch ein paar Dinge zu Funktionsweise der Klasse. Die Klasse baut auf das Binär-System ähnlich wie auch das UNIX- oder auch Datei-Rechtesystem (chmod) . Die möglichen Rechte beim Zugriff auf Dateien sind euch vermutlich bekannt. Lesen, Schreiben und Ausführen (die Unterscheidung in Besitzer, Gruppen und Öffentliche Berechtigungen lassen wir außer Acht). Diesen drei Rechten wurden Zweierpotenzen zugewiesen. Ausführen => 1 (2^0) Schreiben => 2 (2^1) Lesen => 4 (2^2) Durch addieren der einzelnen Rechte kann man alle Rechte eines Users auf eine Zahl zusammenführen. Administratoren dürfen ja bekanntlich alles (=1+2+4=7) wohingegen andere User zum Beispiel nur Lesen und Schreiben dürfen (=2+4=6). Das besondere an einem binären Rechtesystem ist nun, dass man aus dieser Zahl (anders als beim Dezimalsystem) wieder alle Rechte extrahieren kann. Dies wird klarer wenn man die drei Zahlen für Lesen, Schreiben und Ausführen ins Binärsystem (Zählung von rechts) übersetzt. Ausführen => 001 Schreiben => 010 Lesen => 100 Der Administrator besitzt also die rechte 111 und der vorhin erwähnte User 110. Mein auf dieser Idee aufbauendes Rechtesystem ist sehr Performance freundlich und benötigt nur zwei Tabellen. Es soll eine Tabelle für die User-Daten und eine für die Daten der "privaten" Bereiche geben. Die User-Tabelle enthält also im einfachsten Fall id | name | password | permissions. Die Tabelle für die "priavten" oder einfacher gesagt, für die geschützten Bereiche, enthält allerdings nun nur noch den Namen des Bereichs und eine zugehörige ID. PHP bietet uns auch schon durch die binären Operatoren eine wundervolle Möglichkeit zur Überprüfung, ob ein Benutzer die nötigen Rechte besitzt. Es ist nämlich möglich über das &-Zeichen eine binäre UND-Verknüpfung zu schaffen. Mit Hilfe dieser Operation kann man zum Beispiel nun feststellen, ob an der dritten Stelle (Zählung von rechts) der binären Zahl, die die Rechte eines Users vereint, eine Eins steht, die dem User im obigen Beispiel das Lesen erlauben würde. Wie findet man allerdings nun mit dem binären Wert aus der Permissions-Spalte der User Tabelle heraus, ob ein Benutzer zugriff auf einen bestimmten Bereich hat oder nicht? Oder auf welche Bereiche er überhaupt Zugriff hat? Die Lösung ist eigentlich einfach. Nimmt man die ID für einen bestimmten bereich in zum Beispiel einem CM-System und nutzt diesen als Exponent zur Basis zwei, so erhält man den binären Wert, den der User als Teil seines binären Wertes besitzen muss. Möchte man nun also alle IDs der Bereiche herausfinden, zu denen ein User Zugriff besitz, kann man dies relativ einfach auszählen. Ein Beispiel: Es gibt die Bereiche bla(ID 1), lol(ID 2), omg(ID 3) und nop(ID 4). Möchte nun jemand zum Beispiel den benötigten Binärwert zu bla wissen, muss er nur 2^ID(lol) = 2^2 = 4 rechnen. Möchte man also alle Bereiche wissen, zu denen ein Benutzer Zugriff besitzt, muss man einfach nur nach dem größten möglichen Exponenten zur Basis zwei suchen, bei dessen Subtraktion vom binären Permissions-Wert des Users nicht null herauskommt. Man durchläuft also eine Schleife solange, bis kein Restwert der Permissions mehr da ist. Gibt es also einen Nutzer Klaus mit dem binären Permissions-Wert 20 in meinem oben begonnenen pseudo CM-System, so setzen sich seine Werte wie folgt zusammen. P(Klaus) = 2^ID(nop) + 2^ID(lol) Der Benutzer Klaus hat also Zugriff auf die Bereiche nop und lol. In PHP kann man dies, wie schon gesagt mit einer Schleife leicht errechnen. PHP-Code: Ich hoffe, dass das System klar geworden ist. Bei Fragen stehe ich natürlich gerne zur Verfügung und für Anregungen bin ich auch immer offen. Übersicht über die Methoden __construct() - Is called when the class is instanced addMod() - Adds a new protected section delMod() - Removes section from table getMods() - Returns all section-ids addUser() - Updates the permissions of an user delUser() - Removes user from table editUser() - Changes the data of an user getUser() - Returns data of the given user getPerms() - Returns all rights of an user calcPerms() - Calculates permission integer of an user check() - Checks access rights getId() - Returns the id to a user or secured area Die Datenbank Struktur 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', 'pseudo@web.de', 30); INSERT INTO `user` VALUES (2, 'klaus', '0f5f53ea8fe0e8eeb72db72b47ddf351', 'klaus@avedo.net', 14); PHP-Code: |
| | |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |
| Supermoderator HD Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Hallo, die vorgehensweise 2^x hat leider den Nachteil, das i.d.R. bei 31 Schluss ist, da die Zahlen dann zu groß werden.
__________________ Refining Linux Advent Calendar series “24 Outstanding ZSH Gems” |
| | |
| | |
| moderatives Dielektrikum Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Außerdem dürfte die Sache für eine große Anzahl von Beiträgen ohnehin ein Performanceproblem verursachen. Das erinnert doch stark an Primzahlenzerlegung.
__________________ -- One pixel is still too big. Please make it smaller. ASAP. Initiative Mittelstand. Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers. -- |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 06.09.2008
Beiträge: 189
![]() | Das mit dem 2^x sollte kein Problem sein, da man mit BIGINT, wenn man es braucht auf diese Weise 64 Module einbinden. Das sollte für die meisten Systeme absolut reichen. Und in zum Beispiel einem einfachen Newssystem sollen die Admins Beiträge
Beispiel: Klaus darf Artikel erstellen und editieren. => 2^ID(erstellen) + 2^ID(editieren) => 2^2 + 2^3 => 4 + 8 => 12 (binärer Permissions Wert von Klaus) Peter ist Superadmin und darf alles. => 2^ID(erstellen) + 2^ID(editieren) + 2^ID(löschen) => 2^1 +2^2 + 2^3 => 2 + 4 + 8 => 14 (binärer Permissions Wert von Peter) Lässt man diese Werte nun durch die oben gepostete Schleife laufen, erhält man für Peter: Array ( [1] => 1 [2] => 2 [3] => 3 ) für Klaus: Array ( [1] => 2 [2] => 3 ) ...also, wie gesagt ein Array mit den IDs der Bereiche zu denen die deiden Zutritt haben. Ich hoffe ich konnte alle Klarheiten restlos beseitigen. MfG, Andy //EDIT: Performance-Probleme hatte ich bisher noch nicht. Teste die Klasse doch einfach mal.
__________________ I'm so tired of slitting the throats of people calling me a violent psychopath. |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 05.08.2008
Beiträge: 1.000
![]() | Hi Man hätte natürlich noch die Relativitätstheorie und das Heisenbergsche Unschärfetheorem mit in das Rechtesystem aufnehmen können. Soweit ich das sehe geht es um "Wo darf man" und "Was darf man". Wie wärs mit einem String Wo_Was also z. B. eine Buchstabenreihe für wo und dec für delete, edit, create. Wo kann dann aus irgendwelchen Buchstaben bestehen, von denen jeder einzelne einen Bereich kennzeichnet. Oder hast Du da etwa 2^13 Bereiche? Dies Auswertung des Strings dürfte tendenziell überschaubarer bleiben als die Untersuchung von Binärausdrücken. |
| | |
| | |
| moderatives Dielektrikum Registriert seit: 21.05.2008
Beiträge: 34.241
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Also ich weiß nicht was dagegen spricht. Binär verarbeitet sich schon gut. So würd ichs machen: Code: User ID | Name | Passwort Permissions UserID | ContentID | PermissionRWE Content ID | Text Code: Permissions UserID | ContentID | R | W | E
__________________ -- One pixel is still too big. Please make it smaller. ASAP. Initiative Mittelstand. Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers. -- |
| | |
| | ||
| Supermoderator HD Registriert seit: 16.03.2008
Beiträge: 8.425
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | In der MySQL-DB könntest du größere Werte vielleicht speichern, aber PHP versagt dann. Einen solchen Wert bekommst du in keine Variable mehr, was heißt, dass du die Berechnung mit MySQL durchführen musst. Außerdem wachsen die Zahlen gigantisch schnell und werden auch MySQL irgendwann überfordern (mit dem Typ BIGINT gibt MySQL bei 63 auf). 2^31 ist bereits 2147483648 und 2^63 ist 9223372036854775808 und somit der Tod auf MySQL-Seite. BIGINT kann bis 9223372036854775807, in der Einstellung UNSIGNED sogar bis 18446744073709551615. Letzteres lässt dich dann mit 2^64 erschlagen. MySQL bringt es also auf die doppelte Leistung von PHP (meine Hochachtung), ist aber bei weitem auch nicht unerschöpflich. Zitat:
__________________ Refining Linux Advent Calendar series “24 Outstanding ZSH Gems” | |
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Mysql organisation und Rechtesystem | SchmaR | PHP Tipps 2008 | 3 | 08.05.2008 19:25 |
| Problem bei binärem Rechtesystem | SilentSight | PHP-Fortgeschrittene | 27 | 28.04.2008 15:07 |
| Rechtesystem | seejay | Datenbanken | 14 | 09.02.2006 21:19 |
| Besucher kamen über folgende Suchanfragen bei Google auf diese Seite |
| php rechtesystem, rechtesystem php, binäres rechtesystem, rechtesystem binär, php rechte system, php user rechte system, rechte binär, php binäres rechtesystem, rechtesystem in php, php mvc rechtesystem, php rechte binär, php binäre operatoren, php zweierpotenzen, php zweierpotenz, zweierpotenzen php, user rechtesystem php, rechte system php, rechtesystem, benutzer rechte binär, php rechtesystem bitfeld |