PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr (https://www.php-resource.de/forum/)
-   PHP Developer Forum (https://www.php-resource.de/forum/php-developer-forum/)
-   -   Zugangsberechtigung für User-Typen (https://www.php-resource.de/forum/php-developer-forum/87559-zugangsberechtigung-fuer-user-typen.html)

pascal007 14-10-2007 12:29

Zugangsberechtigung für User-Typen
 
Hi

Ich habe gerade ein kleines logisches Problem und weiss nicht, wie ich das realisieren soll. Es geht um folgendes:

Ich habe mir mal spasseshalber angefangen ein Forum zu coden (wer es sehen will / muss). Bisher klappt ja alles ganz gut, aber jetzt würde ich gerne Zugangsberechtigungen für die einzelnen Unterforen einbauen, also so in etwa wie:

Registrierte Benutzer dürfen schreiben und lesen, nicht Registrierte dürfen nur lesen und nicht schreiben, oder nichts von beidem.

Wie soll ich das realiseren? Soll ich in der Tabelle in denen ich die Forums gespeichert haben zwei Attribute anlegen "wright" (Schreibrecht) und "rright" (Leserecht). "0" wäre dann "für alle zugelassen" und "1" wäre "nur für registrierte".

Wenn sich ein User anmeldet wird eine SESSION-Variable "tspb_type" angelegt (0 = User, 1 = Admin), ist der User nicht angemeldet ist die Variable nicht gesetzt... wie realisiere ich jetzt die Zugangsberechtigung am besten? Bin über jeden Vorschlag oder sogar Code-Beispiele froh.

combie 14-10-2007 12:37

Schau dir mal die ACLs vom Zend Framework an.

pascal007 14-10-2007 12:48

Würde das aber gerne selbst coden (das interessiert mich) und nicht eine fertige Klasse nutzen... trotzdem danke für den Hinweis :D.

combie 14-10-2007 12:57

Habe ich "schauen" oder "benutzen" gesagt?

pascal007 14-10-2007 13:22

Zitat:

Original geschrieben von combie
Habe ich "schauen" oder "benutzen" gesagt?
Okay, hast gewonnen ;). Ich habe mir das Kapitel zu der Klasse zend_acl mal durchgelesen und mir auch die dazugehörenden Dateien mal angeschaut, aber ich verstehe nur Bahnhof :confused:. Ich kann irgendwie keine Verbindung zu meiner Forumsberechtigungen herstellen...

combie 14-10-2007 13:51

Nagut, dann etwas Ausführlicher..
:D aber ohne auf Einzelheiten ein zugehen.. :D

Du bist nicht der Erste mit einem solchen Probleme.

Und da du in einem Forum Fragen dazu stellst, vermute ich mal, dass deine selbstgebastelte Lösung nicht unbedingt sofort besser besser als eine fertige Lösungen wird.

Schau dir ab, wie es Andere gelöst und eingesetzt haben.

1. Für dich würde wohl ein User+Gruppen Konzept erstmal reichen. Schau dir an wie Linux das macht. Nachbauen!

2. ACLs sind deutlich komplexer und universeller, feiner einstellbar. Da kannst du dir, in etwa, bei Windows was abschauen.

tontechniker 14-10-2007 14:46

Liste der Anhänge anzeigen (Anzahl: 1)
Die Access Control Lists sind sehr sinnvoll, damit kann man eigentlich alles sehr flexible realisieren. Die Implementation von Zend ist afaik nicht so toll (langsam und sehr aufwändig), die Dokumentation und das Konzept ist aber ganz gut. Prinzipiell ist das ganze in drei Bereiche aufgeteilt: Rollen, eine Art Gruppe oder ein Benutzer, Ressourcen, das sind Module oder in deinem Fall zum Beispiel Foren / Threads und Aktionen (Hinzufügen, Bearbeiten, Löschen, usw.). Du kannst jede Kombination dieser drei erlauben oder verbieten. Je nach dem was du machst fragst du wieder eine Kombination ab. Ich hab die Dokumentation meiner Implementation mal angehängt wenn dich das interessiert.

pascal007 14-10-2007 15:23

Das ist ja sehr nett von dir @tontechniker, aber ich will doch eifnach nur das selbst möglichst elegant realiseren. Da das Board vor allem aus der Idee entstanden ist meine Fähigkeitne in PHP und MySQL zu verbessern, will ich da wenn möglich alles selbst schreiben (oder in einem Forum mit erfahrenen Usern eine Lösung erarbeiten ;)). Damit ich auch bei jeder Codezeile weiss, was das Script macht.

Deshalb wäre ich schon mit einer detailiertert Vorgehensweise die auf meine Situation zutrifft vollkommen zufrieden :D.

combie 14-10-2007 16:30

Zwei übliche und weitverbreitete Konzepte wurden dir vorgeschlagen. Jetzt ist es an dir weitere zu suchen, oder diich für eine der beiden zu entscheiden. Danach Implementieren.

PHPler 15-10-2007 03:14

Ich hab in meinem CMS die Benutzerverwaltung wie folgt gelöst:

1) Du arbeitest von Grund auf mit Benutzergruppen. Jeder Besucher wird automatisch einer Benutzergruppe zugeordnet, auch wenn er nur Gast ist. Dann erstellst Du z.B. folgende Gruppen:
1 Gast
2 Standard Benutzer
3 Premium Benutzer
98 Moderator
99 Administrator

2) Du ordnest nun den Besuchern die Benutzergruppen zu. Jeder Besucher, der nicht eingeloggt ist, bekommt automatisch die Benutzergruppe 1. Jeder Besucher der sich einloggt bekommt automatisch die Benutzergruppe 2. Premium Benutzer (wenn Du denn welche hast) bekommen die Benutzergruppe 3. Moderatoren 98, Administratoren 99.

3) Du Speicherst alle Benutzergruppen die einem Benutzer zugeordnet sind in ein Array.

4) Du schreibst deine Funktion, und überlegst Dir, welche Benutzergruppen diese aufrufen dürfen. Daraus ergibt sich dann folgender Code:

PHP-Code:

$userrank = array(...); // Array mit den Benutzergruppen

function foo() {
    ... 
// Meine Funktion
}

/*
Überprüft, ob die angegebenen Benutzerränge 3, 97 bzw. 99 in
$userrank gespeichert sind. Ich habe mich hier für array_intersect
entschieden, um zwei Arrays zu vergleichen. Damit ist es egal ob
dem Benutzer die Benutzergruppe 3, 97 oder 99 zugeordnet ist.
Sobald eine Übereinstimmung gefunden ist, wird die Funktion
aufgerufen.
*/
if(count(array_intersect($userrank, array(3,97,99))) > 0) {
    
foo();


Für weitere Funktionen kannst Du Dir dann natürlich weitere Benutzergruppen zulegen.

pascal007 15-10-2007 10:51

solche Antworten meinte ich :D. Vielen Dank :D! Werde mal mein Glück mit deiner Idee und dem Code dazu versuchen ;).

Eines ist mir noch ein klein wenig unklar: wenn ich jetzt z.B. bei

PHP-Code:

... $userrank, array(3)) ... 

nur die 3 im Array drinnstehen habe, und es kommt ein Admin (99) ist dann die Abfrage auch wahr? Also kann dann jede Zahl die grösser als 3 ist die Funktion foo() aufrufen?

PHPler 15-10-2007 16:19

Nein, es geht nicht darum, dass jeder dessen Zahl größer ist als 3 automatisch Zugriff hat. Wenn Du z.B. einen User hast mit dem Rank 2 (Standard User) und 99 (Administrator), also:

PHP-Code:

$userrank = array(2,99); 

Und Du machst dann den hier:

PHP-Code:

if(count(array_intersect($userrank, array(3))) > 0

Die ganze Abfrage überprüft, ob 3 in $userrank gespeichert ist. Da im Userrank nur 2, und 99 gespeichert ist, ist die Abfrage also falsch, und der Benutzer kann die Funktion nicht aufrufen, obwohl er Administrator ist. Erst wenn Du dem Benutzer die Benutzergruppe 3 zuweist, also:

PHP-Code:

$userrank = array(2,3,99); 

ergibt die Abfrage ein Wahr, und der Benutzer kann die Funktion aufrufen. Für Administratoren kannst Du Dir den Aufruf auch folgendermaßen anpassen:

PHP-Code:

if(in_array(99$userrank) OR count(array_intersect($userrank, array(3))) > 0

Damit kann der Administrator in jedem Fall die Funktion aufrufen.

Somit kannst Du für alles eigene Rechte setzen und das ganze dann über die Benutzergruppen steuern. Hast Du (aus welchen Gründen auch immer) viele Benutzergruppen, kannst Du Dir im übrigen auch eine Umkehrfunktion dazu basteln, so dass du auch einzelne Benutzergruppen ausschließen kannst. ;)

PHP-Desaster 15-10-2007 19:28

Kannst du deinen blöden Kommentar im Quelltext bitte umbrechen? Macht voll kein Spa0, diesen Thread zu lesen!!

pascal007 15-10-2007 20:49

Okay, jetzt is mir das klar.

Hast du auch noch einen Tipp, wie ich am besten dieses Array des Users beim einloggen zusammenbaue? Also dass wenn er Admin ist, alle Typen (3,2,1,99, usw.) in dem Array stehen?
Wie hast du das gemacht gelöst?

tontechniker 15-10-2007 21:28

Schreib den Wert in die Datenbank und kombiniere in_array und array_slice. Und brich deinen Code um!


Alle Zeitangaben in WEZ +2. Es ist jetzt 02:45 Uhr.

Powered by vBulletin® Version 3.8.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.3.0
[c] ebiz-consult GmbH & Co. KG