|
|
|
|
|
|
|
#1 (permalink) |
|
Erfahrener Benutzer
Registriert seit: 07.11.2004
Beiträge: 160
![]() |
Hallo,
ich hoffe so fragen hier sind genauso erlaubt, da es nicht direkt um die programmierung geht, sondern eher um den Aufbau. Ich möchte ein Rechtesystem aufbauen. Und jetzt wollte ich fragen, ob ihr noch eine bessere Idee habt, das DB-System aufzubauen als meine folgende. Zur beschreibung: Es gibt erstens User (wohl klar Es gibt Gruppen, die auch bestimmte Rechte verleihen, die aber auch innerhalb der Gruppenmitglieder wieder entzogen werden soll /insbesondere recht bestimmt bereiche zu betreten oder sachen zu benutzen Jeder User kann mehreren Gruppen angehören Es sollen neue Gruppen erstellt werden können, die auch neue Rechte mit sich bringen Es soll Gruppen geben, wie die Moderatorengruppe, deren Mitglieder je nach Admin alle rechte für bestimmte Gruppen bekomme, aber nicht generell für alle. Nur der/die Admins sollen immer für alle Gruppen alle Rechte bekommen, es sei den nach abstache mit den gruppenmoderatoren (bestimmtes recht der Gruppen) Jetzt zu meiner umsetzung usertabelle id, id_rechte(Varchar) rechtetablle id, name gruppentabelle id, id_users(VARCHAR),id_rechte(VARCHAR) Wenn jetzt eine neue Gruppe erstellt wird. Werden x neue rechte erzeugt, und diese in die rechtetabelle eingetragen. Alle diese IDs werden zusammen als String (so '1,2,3,4,..') in der gruppentabelle.id_rechte gespeichert. Dann bekomm jeder User in seine id_rechte diesen String auch drangehängt, sovern er sich in der id_users befindet. Zum schluss wird noch nach der Admingruppe gesucht und allen dieser teilnehmer auch das alle diese Rechte erteilt. Am schluss eine Mail an die Admins, dass es eine neue gruppe gibt und eine an die User, dass sie in einer neuen gruppe sind. Dazu ein Adminmenü, dass es erlaubt den Admins einzelnen User alle Rechte der gruppen zu geben.(als wären sie hinzugefügt worden). Wenn eine Gruppe wieder gelöscht wird. werden alle rechte.id 's gelöscht und auch bei allen Usern der Teil des rechtestrings entfernt. Es ist ja schon etwas kompliziert, gibt es dafür noch ein besseres System oder denkt ihr meine idee lässt sich ohne weitere probleme so übernehmen |
|
|
|
|
|
|
|
PHP Code Flüsterer
Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten
|
|
|
|
#2 (permalink) | |
|
Erfahrener Benutzer
Registriert seit: 02.04.2008
Beiträge: 4.034
![]() |
Zitat:
![]()
__________________
Gruss L |
|
|
|
|
|
|
#3 (permalink) |
|
Erfahrener Benutzer
Registriert seit: 24.12.2004
Beiträge: 1.818
![]() |
es gäbe aber auch eine mathematische lösung für die rechte, die relativ elegant ist und auf zusätzliche tabellen und damit auf teure joins verzichten kann.
dazu definiert man die rechte folgendermaßen: PHP-Code:
PHP-Code:
cya axo |
|
|
|
|
|
#4 (permalink) |
|
Erfahrener Benutzer
Registriert seit: 25.04.2005
Beiträge: 1.356
![]() |
@axo
Das Binärsystem ist zwar klasse ... es hat nur leider einen entscheidenden Nachteil ... es lässt sich nicht indexieren in der DB
__________________
Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält. |
|
|
|
|
|
#5 (permalink) | |
|
Erfahrener Benutzer
Registriert seit: 24.12.2004
Beiträge: 1.818
![]() |
Zitat:
|
|
|
|
|
|
|
#6 (permalink) |
|
Erfahrener Benutzer
Registriert seit: 07.11.2004
Beiträge: 160
![]() |
@lazydog: auch wenn du nicht alles verstanden hast, ist doch eigentlich alles drin. Ich habe nur die tabellen Benutzerrechte,Benutzergruppe und Gruppenrechte aufgelöst und mit dem varchar gemacht. aber stimmt, meine sache ist nicht gerade normalformkonform. Werd ich mal ändern.
@axo: ein weiterer nachteil ist die menge der rechte. wenn man um die 10rechte normal + etwa 4 pro gruppe hat kommt man mit dem system schnell an riesiege menge von speicherbedarf, weil die zahlen exponential zunehmen. |
|
|
|
|
|
#7 (permalink) | |
|
Erfahrener Benutzer
Registriert seit: 24.12.2004
Beiträge: 1.818
![]() |
Zitat:
grundsätzlich kannst du mit einem 32-bit-integer bis zu 31 berechtigungen ablegen, und: 1. es spricht nichts dagegen, die berechtigungen in mehrere aufzuteilen, d.h. einfach zwei integers zu verwenden, und 2. gilt, dass auch in einem float jeweils nur der exponent belegt wird, was zur folge hat, dass man theoretisch auch bei floats keine rundungsfehler zu erwarten hat - die mantisse ist ja immer gleich. ich bin grad am ausprobieren, wo überhaupt rundungsfehler anfangen - gerade eben bin ich bei 2^127, also 127 berechtigungen, und hab immer noch keine fehler. [edit] die grenze für floats ist 2^1023 (hätte mir auch klar sein können [/edit] grüße axo |
|
|
|
|
|
|
#8 (permalink) | |
|
Erfahrener Benutzer
Registriert seit: 25.04.2005
Beiträge: 1.356
![]() |
Zitat:
__________________
Gewisse Dinge behält man besser für sich, z.B. das man gewisse Dinge für sich behält. |
|
|
|
|
|
|
#9 (permalink) |
|
Erfahrener Benutzer
Registriert seit: 07.11.2004
Beiträge: 160
![]() |
welchen vorteil habe ich wenn ich es nach der normalenform mache. habe mir gerade ein paar gedanken gemacht und gemerkt, dass mein system sogar besser finde. Nicht erst tausend joints wenn ich mal wissen in welchen gruppen der user mit dem namen xx ist.
|
|
|
|
|
|
#10 (permalink) | ||
|
Erfahrener Benutzer
Registriert seit: 24.12.2004
Beiträge: 1.818
![]() |
Zitat:
beispiel: Code:
<?php
$sql = '
CREATE TABLE test (
userid int(11) unsigned NOT NULL auto_increment,
acl int(11) unsigned NOT NULL default '0',
PRIMARY KEY (userid)
) TYPE=MyISAM';
mysql_query($sql);
$sql = 'INSERT INTO test (acl) VALUES ';
for ($i=0;$i<1000000;$i++) { // oder einfach ein-zwei nullen mehr ...
$sql .= "(" . $i . "),";
}
$sql .= " (0) "; // unwichtig, ich will nur in der for-schleife das komma nicht überprüfen.
mysql_query($sql);
?>
ich hab grad eine tabelle mit ca. 4 millionen einträgen - wer so viele user hat, soll sich bitte mal melden. die test-tabelle hat bewusst keinen index auf 'acl', nutzt ja (hier hat hstev recht) eh nix. um jetzt user herauszubekommen, die die berechtigung XY haben, muss man nur die aktuelle berechtigung des users "bitwise AND " mit der berechtigung, die überprüft werden soll verknüpfen. im prinzip geht es ja nur darum: wenn das bit in beiden zahlen gesetzt ist, hat der user die berechtigung, wenn nicht - nicht. die abfrage für berechtigung 0 ( 2^0 = 1 ) lautet also: Code:
SELECT * FROM test WHERE acl & 1 Code:
SELECT * FROM test WHERE acl & 13 falls das query cache an ist, unbedingt SELECT SQL_NO_CACHE ausführen, sonst werden folge-abfragen immer aus dem cache geholt. mein ergebnis: Code:
Showing rows 0 - 29 (3578771 total, Query took 0.0007 sec) SQL query: SELECT SQL_NO_CACHE * FROM `test` WHERE acl &13 LIMIT 0 , 30 dass kein index verwendet werden kann, erklärt EXPLAIN auch, allerdings scheint es schon so zu sein, dass mySQL die werte bereits sortiert (im b*-baum) ablegt (wenn nicht, spalte indizieren, dann ist das garantiert der fall), womit die bitweisen vergleiche genauso schnell sind wie die indizierung. ... welcher unterzweig eines b*-baumes genommen werden muss, ist ja bekanntermaßen mit nur sehr wenig touches möglich. Zitat:
erstens kann man sauber konstanten definieren, und zweitens die ganze ACL-kacke in einer zentralen klasse sauberst kapseln, so dass dieses argument auch nicht mehr zählt. ich bleibe (noch) dabei: die bit-lösung ist mindestens genauso schnell, braucht aber weniger speicher und ist darüberhinaus auch noch schön. |
||
|
|
|
|
|
|
|
PHP Code Flüsterer
Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten
|
|
|
| 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 |
| Besucher kamen über folgende Suchanfragen bei Google auf diese Seite |
| datenbank rechtesystem beispiel, datenbank nicht binäres rechtesystem, datenbank rechtesystem homepage |

Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.