PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : "Benutzerverwaltung" für PHP / Webapplikation



JAF
21-03-2009, 16:47
hallo,

ich habe im moment eine webanwendung, bei der man sich einloggen kann.
beim einloggen wird in einer datenbank die "benutzergruppe" abgefragt und als SESSION information gespeichert.

nun gibt eine php-datei, die für die anzeige eines JAVA-Menüs zuständig ist.
je nach benutzergruppe ist dieses menü unterschiedlich. diese datei wird im von allen php-dateien importiert, also egal wo sicher der user befindet -> immer gleiches menü.

weiters wird beim aufruf jeder seite geprüft, ob ein benutzer mit dieser benutzergruppe lt. der SESSION informationen erlaubt ist auf diese seite zuzugreifen.


also habe ich hier 2 schutzmechanismen für php-seiten zu dieser appikation:

1) wird im menü nur angezeigt, auf welche seiten der user auch zugreifen darf (eigentlich ja kein wirklicher schutz, aber sicher positiv)
2) falls der benutzer auf nicht erlaubte seiten trotzdem zugreifen will, kommt eine fehlermeldung.


nun ist es so, dass diese appikation immer weiter wächst.
ich muss immer jede seite einpflegen für das JAVA-Menü (das ist ja noch ok). aber trotzdem fehlt mit hier eine größere fexlibilität, z.b. ein benutzer aus gruppe "1" soll trotzdem auf seite XXX zugreifen können, auch wenn es die anderen in dieser gruppe nicht dürfen. das ist im moment nur möglich, wenn ich eine neue gruppe anlege, was wieder bedeuten würden, dass ich diese benutzergruppe in ALLEN seite hinzufügen müsste.


hat jemand ideen/vorschläge, wie ich das flexibler und einfacher gestalten kann?
danke

jan61
23-03-2009, 20:24
Moin,

so als Schnellschuss: Warum legst Du die Seiten / Menüs und die Berechtigungen dafür nicht auch in der Datenbank ab?

Jan

JAF
24-03-2009, 07:59
ja, ich weiss, dass das wohl "zwingend" wird damit.
die frage ist, wie designmässig am besten machen.

ausserdem möchte ich für jeden welchsel von seite zu seite nicht die datenbank belasten...

meine idee wäre:

jede seite wird "durchnummeriert".

wenn sich der user nun einloggt, wir passwd geprüft und dann die daten aus der "berechtigungstabelle" gelesen und in die php-session eingetragen.

1) das menue setzte sich aus dieser tabelle zusammen
2) wenn der user auf eine seite zugreifen will, wird geprüft, ob diese seite lt. der berechtungstabelle in seiner PHP-session erlaubt ist.

ist das so vorstellbar? oder gibts es verbessungsvorschläge?

BLUESCREEN3D
24-03-2009, 13:40
JAVA-Menüs
Du meinst vermutlich JavaScript (großer Unterschied).


das ist im moment nur möglich, wenn ich eine neue gruppe anlege, was wieder bedeuten würden, dass ich diese benutzergruppe in ALLEN seite hinzufügen müsste.
Die Benutzergruppen stehen im Quellcode jeder Seite?


ausserdem möchte ich für jeden welchsel von seite zu seite nicht die datenbank belasten...
[...]
wenn sich der user nun einloggt, wir passwd geprüft und dann die daten aus der "berechtigungstabelle" gelesen und in die php-session eingetragen.
Und wo ist die Berechtigungstabelle gespeichert?
Mach dir keine Sorgen wegen dem lächerlichen Query und benutz die Datenbank. Speicher alle Benutzer, Gruppen, Menüpunkte und Zugriffsrechte in der DB - dafür ist sie da.
Wenn du dabei alles richtig machst und trotzdem irgendwann Performance-Probleme hast, kannst du anfangen, nach Optimierungsmöglichkeiten zu suchen.

JAF
24-03-2009, 16:20
Du meinst vermutlich JavaScript (großer Unterschied).

ja, sorry, JavaScript ist gemeint



Die Benutzergruppen stehen im Quellcode jeder Seite?


so ist es



Und wo ist die Berechtigungstabelle gespeichert?

es gibt jetzt noch keine "berechtigungtabelle". im moment gibt es nur usergruppen, diese wird an die session-informationen übergeben, sobald sich ein user einlogt. beim zugriff auf eine seite wird dann geprüft, ob DIESE usergruppe zugreifen darf. so ist es im moment.



Mach dir keine Sorgen wegen dem lächerlichen Query und benutz die Datenbank. Speicher alle Benutzer, Gruppen, Menüpunkte und Zugriffsrechte in der DB - dafür ist sie da.
Wenn du dabei alles richtig machst und trotzdem irgendwann Performance-Probleme hast, kannst du anfangen, nach Optimierungsmöglichkeiten zu suchen.

nun, wie gesagt, ich will nicht immer beim zugriff auf jeder seite die datenbank abfragen müssen. darum denke ich, ist das laden der "berechtigungstabelle" in die session der bessere weg und dann beim zugriff auf einer seite wird geprüft, ob er lt. den session-parameten zugreifen darf.

bei machen seiten wird im moment ja nicht mal die (mysql)datenbank benötigt.

der einzige nachteil auf diese art natürlich: benutzer bekommt zusätzliche berechtigung -> d.h. neu einloggen, sonst gibts keinen zugriff.

BLUESCREEN3D
24-03-2009, 16:49
der einzige nachteil auf diese art natürlich: benutzer bekommt zusätzliche berechtigung -> d.h. neu einloggen, sonst gibts keinen zugriff.
Du hast auch das umgekehrte Problem, wenn du die Sessions nicht zeitlich begrenzt: Berechtigung wird entzogen, Benutzer hat die Rechte aber noch in der Session.

JAF
24-03-2009, 17:49
das ist schon klar.

aber das "problem" habe ich immer.
ausser wenn ich z.b. im link immer username & passwort mitgebe *g*

auch mit ständiger prüfung (bei jeder seite) über die datenbank.
denn der user soll ja auch nicht bei jeder seite seine benutzerdaten eingeben müssen ;)

BLUESCREEN3D
24-03-2009, 18:03
Wenn du die Zugriffsrechte in der DB speicherst und in der Session nur die ID des Benutzers, dann hättest du immer die aktuellen Rechte zum Vergleichen und damit nicht dieses Problem.

JAF
24-03-2009, 18:43
nein, das stimmt doch auch nicht, oder?

denn "Session nur die ID des Benutzers": dann ist diese ID des benutzers genau weg, wenn die session ungültig wird...

elrond
30-03-2009, 09:36
hmm,

mit der benutzerverwaltung mach ich es folgendermaßen:

-in der DB habe ich je eine tabelle mit benutzern, benutzergruppen und modulen
-ein benutzer kann beliebig vielen benutzergruppen zugeordnet sein
-benutzergruppen haben entweder lesenden, schreibenden oder garkeinen zugriff auf module

Module sind in meinen anwendugen manchmal menübäume, oder ganze funktionen oder aber auch nur einzelne aktionen, die ausgeführt werden können.

Der benutzer wird bei mir ganz am Anfang des aufrufes identifiziert. Mit dieser Identifikation frage ich dann einfach die art der Berechtigung ab. zB.



if(getperm("KDJOIN")==WRITE) {
.......
}


"KDJOIN" ist der eindeutige Code für irgendein modul...

Mit einem kleinen Stück Frontend zur Verwaltung kann ich die Zugriffsrechte so beliebig fein verteilen...

JAF
30-03-2009, 19:58
hi elrond,

was macht dein getperm() im hintergrund?
ruft es auch (ständig) die datenbank ab?

wie realisierst du den login? auch via session ID etc?

elrond
31-03-2009, 06:32
getperm findet anhand der userid und des modulcodes die höchste vergebene berechtigung heraus. Das passiert in der db.



function getperm($modkey) {
$sql="select max(mga.permid) as permid from modul m,modgroupass mga, usergroupass uga where m.modid=mga.modid and mga.usergroupid=uga.usergroupid and m.modkey='".$modkey."' and uga.userid=".$GLOBALS['msess']->USERID;
#echo $sql;
$rs_arr=$GLOBALS['db']->select($sql);
if(!$rs_arr) {return 0;}
else {return $rs_arr[0]["permid"];}
}




die identifikation des users erfolgt bei mir auch über die sessionid. dafür benutze ich eine eigene klasse deren globale instanz "msess" ich abfrage...

JAF
31-03-2009, 07:40
danke für deine infos.