Probleme mit der Navigation wegen Rechtesystem

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Probleme mit der Navigation wegen Rechtesystem

    Hallo zusammen,

    ich arbeite gerade an einer Navigation, deren Links von einer Datenbank ausgelesen werden, und dann über das Rechtesystem "ausgewertet" wird, ob der Link angezeigt werden soll, oder nicht (Das Rechtesystem steckt noch in Kinderschuhen).

    Die Datenbank ist folgendermaßen aufgebaut:

    id | aktiv | kategorie_id | name | url | stelle | rechte

    (nur id für die db | ob der link überhaupt angezeigt werden soll oder nicht | zu welcher "Überordnung" der Link gehört | wird für den Link angezeigt | dreimal dürft ihr raten | an wievielter stelle der Link stehen soll | wer den Link sehen darf)

    Das Rechtesystem ist mit einem gestaffeltem Zahlensystem aufgebaut:

    0: Nicht angemeldet
    25: Normaler User, nur die normalen Rechte
    50: Moderatoren
    75: Entwickler
    100: Admin

    (wie gesagt, steckt noch in den Kinderschuhen)

    Das Auslesesystem für doie Anzeige:

    Quellcode

    1. $ergebnis = $mysqli->query("SELECT id, aktiv, name, url, rechte FROM navigation_kategorie ORDER BY stelle");
    2. echo "<ul>\n";
    3. while ($result = $ergebnis->fetch_object())
    4. {
    5. if (((($result->rechte <= "24")&&($user->rechte >= "25"))||(($result->rechte <= "24")&&(!isset($user)))||(($result->rechte >= "24")&&($user->rechte >= "25")))&&($result->aktiv == "1")) {
    6. $navi_kate_id = $result->id;
    7. $abfrage = $mysqli->query("SELECT id, aktiv, login, name, url, rechte FROM navigation_links WHERE kategorie_id = '$navi_kate_id' ORDER BY stelle");
    8. echo "<li>";
    9. echo "<a href=\"".$result->url."\">";
    10. echo bbcode($result->name);
    11. if (($result->id == "4")&&($_SESSION['eingeloggt'] == TRUE))
    12. {
    13. echo " [".$user->username."]";
    14. }
    15. echo "</a>\n";
    16. echo "<ul>\n";
    17. while ($row = $abfrage->fetch_object())
    18. {
    19. if (((($row->rechte <= "24")&&($user->rechte >= "25"))||(($row->rechte <= "24")&&(!isset($user)))||(($row->rechte >= "25")&&($user->rechte >= "25")))&&($row->aktiv == "1"))
    20. {
    21. echo "<li><a href=\"".$row->url."\">";
    22. echo bbcode($row->name."</a></li>\n");
    23. }
    24. }
    25. echo "</ul>";
    26. echo "</li>\n";
    27. }
    28. }
    29. echo "</ul>\n";
    Alles anzeigen


    Jetzt habe ich das Problem, dass drei Links nur angezeigt werden sollen, wenn man nicht eingeloggt ist ("Login", "Registrieren", "Passwort vergessen"). Doch da ich mit dem Rechtesystem bei den drei Links bei Rechte 0 eingetragen habe, werden diese auch angezeigt, wenn man eingeloggt ist.

    Wie kann man das am schlauesten lösen, was meint ich?

    Danke schonmal

    Fipsi
  • Wenst mich fragst ist das zahlen System Müll. Ist von Anfänger enstanden um nee abgrenzen zu bewerkstelligen. Am ende ist das unübersichtlich und nicht wirklich mehr Kontrollierbar.

    Wenn du ein Rechtesystem haben willst dann schau dir mal ACL an (Access Controll List)
    Ein Beispiel dafür hab ich vor langen in OOP geschrieben. (Jeder hat mal Angefangen auch ich )

    Hier meine Anfänge einer Acl:
    (siehe letzen Beitrag von mir)
    php2all.de/thread-651-rechtesystem.html

    Dort findest du ein Anfänger Beispiel einer Acl

    Du hast die möglichkeit über ein Array zu Arbeiten oder wie im Beispiel über die Datenbank
    In dem Beispiel kann ein User mehren Gruppen angehören. Also können die Rechte leicht gändert und weiter vergeben werden.
    Zb kann ein User dann der Gruppe Moderator sowie auch der Gruppe Entwickler angehören.
    Es gibt kein Limit für die Anzahl der Gruppen die man angehören kann.

    Jede Gruppe hat ihre eigenen Rechte. Überschneidende Rechte werden gefiltert und das höhere Recht immer zu gewiessen
    Wenn nun die Gruppe Moderator das recht zum lesen hat. Und die Gruppe Entwickler das Recht zu schreiben auf bestimmten Seiten.
    Der User nun beiden Gruppen angehört kann er lesen sowol auch schreiben.

    So kannst du auch eine Gruppe festlegen für User die nicht angemeldet sind (Also nicht eingelogt) Und rechte vergeben was diese User sehen dürfen und machen können.

    Im Letzten Teil wird dann das Recht geprüft.

    Quellcode

    1. <?
    2. $access = new Access();
    3. if(!$access->zugang($user,"log")) // log ist der Rechtename
    4. {
    5. die('Zugriff auf die Seite Verweigert');
    6. }
    7. echo "Zugang Erlaubt";




    Mfg Splasch

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von splasch ()

  • Fipsi schrieb:

    ok, ich fürchte, dannw erde ich vorerst noch n "kleines" Problem damit haben, da ich mit OOP noch nich zurecht komme, arbeite aber immernoch daran das endlich zu ändern.

    Danke dir schonmal für deine Hilfe, hatte aber gehofft, das ginge auch ohne OOP


    Es geht ohne OOP
    Eine Acl kannst du ohne OO auch umsetzen das war ja nur ein Beispiel und hat nix mit der Technick zu tun. Am einfachsten für dich wird es sein mit Array Listen zur Arbeiten.

    Ob du nun die Liste in der Datenbank oder als Array in einer Datei abbildest bleibt dir überlassen. Wenn du die Rechte nicht umbeding Online verwalten willst würd ich auf jeden Fall die Array variante vorziehen.

    Hier mal ein Beispiel wie so einen Acl Liste ausehen kann.

    Quellcode

    1. <?
    2. return array(
    3. 'roles' => array
    4. (
    5. 'author' => 'guest',
    6. 'user' => 'guest',
    7. 'admin' => 'user'
    8. ),
    9. 'resources' => array
    10. (
    11. 'index' => NULL, // Startseite
    12. 'galerie' => NULL, // Galerie
    13. 'login' => NULL, // Authorizierung Prüfung
    14. 'newadmin' => NULL, // Admin Tool
    15. 'about' => NULL, // About Edit
    16. ),
    17. 'rules' => array
    18. (
    19. 'allow' => array
    20. (
    21. // Gast Acount nicht eingelogt
    22. 'guest0' => array(
    23. 'role' => 'guest',
    24. 'resource' => array('login',
    25. ),
    26. 'privilege' => array('index','login','logout')
    27. ),
    28. // Admin Rechte
    29. 'admin99' => array(
    30. 'role' => 'admin',
    31. 'resource' => array('newadmin',
    32. ),
    33. 'privilege' => array('index','create')
    34. ),
    35. // Backend Startseite (Admin Rechte)
    36. 'admin0' => array(
    37. 'role' => 'admin',
    38. 'resource' => array('index'),
    39. 'privilege' => array('index')
    40. ),
    41. // Galerie Verwaltung (Admin Rechte der Seite Galerie Verwaltung)
    42. 'admin1' => array(
    43. 'role' => 'admin',
    44. 'resource' => array('galerie'),
    45. 'privilege' => array('index','add_picture','add_images',
    46. 'del_picture','del_images','add_album',
    47. 'save_album','album_photo','save_photoalbum',
    48. 'del_album','del_alben','sort_album','sort_alben',
    49. 'sort_picture','multiadd_picture','nophoto_album',
    50. )
    51. ),
    52. // Backend About
    53. 'admin2' => array(
    54. 'role' => 'admin',
    55. 'resource' => array('about'),
    56. 'privilege' => array('index','save_about')
    57. ),
    58. )
    Alles anzeigen


    Mach dich mal mit der Therio und technick vertraut bevor du sagt das kann man nicht umsetzen.
    Natürlich kann man hier nicht erwarten das man fertige Scripte bekommt dafür gibst nee Scriptbörse.

    Siehe auch: ACL erleuterung de.wikipedia.org/wiki/Access_Control_List

    Mfg Splasch

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von splasch ()

  • hm... also eigentlich habe ich vor, dass die Rechteverwaltung "mobil" bleibt, also denke ich, dass eine Onlineverwaltung (sprich Datenbank) wahrscheinlich geschickter wäre.

    Ich hab mir dein gerade gezeigtes Beispiel mal ein paarmal durchgelesen und bissl genauer angeschaut und cih msus sagen, ich bin ein bisschen verwirrt:

    - Wie wird einem User sein Recht dann zugeordnet?
    - Muss ich also für jede Seite so n eigenes Rechtesystem basteln?
    - Bzw. muss ich jede Seite da eintragen und einstellen?
  • Fipsi schrieb:

    hm... also eigentlich habe ich vor, dass die Rechteverwaltung "mobil" bleibt, also denke ich, dass eine Onlineverwaltung (sprich Datenbank) wahrscheinlich geschickter wäre.

    Ich hab mir dein gerade gezeigtes Beispiel mal ein paarmal durchgelesen und bissl genauer angeschaut und cih msus sagen, ich bin ein bisschen verwirrt:

    - Wie wird einem User sein Recht dann zugeordnet?
    - Muss ich also für jede Seite so n eigenes Rechtesystem basteln?
    - Bzw. muss ich jede Seite da eintragen und einstellen?


    Am einfachsten ist es über Rollen du kennst das vielleicht von einer Forum Rechte Verwaltung.

    Dem User wird beim Login eine Rolle zu gewiesen. Für die Rolle selbst kannst du einen beliebigen Namen vergeben am besten einen ausagekräftigen.
    Zb. Moderator, Admin, User und so weiter

    Jede Rolle hat dann die zugewissen Rechte laut Liste.

    Muss ich also für jede Seite so n eigenes Rechtesystem basteln?


    Nein das Array oder die Datenbank abbildung speichert die Rechte für alle Seiten.

    Bzw. muss ich jede Seite da eintragen und einstellen

    Ja so kannst du nix vergessen oder übersehen. Seiten wo keine Rechte vergeben wurden sind generell gesperrt und nicht erreichbar.

    dass die Rechteverwaltung "mobil" bleibt, also denke ich, dass eine Onlineverwaltung (sprich Datenbank) wahrscheinlich geschickter wäre

    Es ist natürlich auch möglich das Array online zu bearbeiten und wieder zu Speichern.
    Siehe dazu php befehle wie: file_put_contents und var_export()

    Mfg Splasch
  • Ich bin gerade am überlegen, wie es am sinnvollsten is, so eine struktur mit Datenbank aufzubauen.

    Würde das gehen, wenn jedes mal wenn eine Seite aufgerufen wird, wird die Datenbank abgefragt, darf er diese Seite überhaupt sehen. Und jedes mal wird auch gleichzeitig überprüft, ob die aktuelle Rolle auch noch wirklich aktuell ist?
    Und wie wäre das dann mit der Navigation gehen...?^^

    P.S.: ich weiß, ich bin anstrengend, sry, aber ich bin noch im lernstadion :D
  • Fipsi schrieb:

    Ich bin gerade am überlegen, wie es am sinnvollsten is, so eine struktur mit Datenbank aufzubauen.

    Würde das gehen, wenn jedes mal wenn eine Seite aufgerufen wird, wird die Datenbank abgefragt, darf er diese Seite überhaupt sehen. Und jedes mal wird auch gleichzeitig überprüft, ob die aktuelle Rolle auch noch wirklich aktuell ist?
    Und wie wäre das dann mit der Navigation gehen...?^^

    P.S.: ich weiß, ich bin anstrengend, sry, aber ich bin noch im lernstadion :D


    Zur Datenbank Aufbau kannst du das fertige Er Diagram aus meinen OO Beispiel übernehmen wenn du willst. siehe php2all.de/thread-651-rechtesystem.html
    (Bild Anhang)

    Würde das gehen, wenn jedes mal wenn eine Seite aufgerufen wird, wird die Datenbank abgefragt, darf er diese Seite überhaupt sehen. Und jedes mal wird auch gleichzeitig überprüft, ob die aktuelle Rolle auch noch wirklich aktuell ist?


    Die Rolle ändert sich normal nicht während der ganzen Sitizung. Wenn deine Scripte Zentral aufgebaut sind reicht es aus einmal die Konfiguration zu laden.
    Wenn du unötige Datenbank zugriffe sparen willst. Kanst du auch das Array aus der Datenbank in die Session laden. So brauchst du nicht bei jeden Klick erneut die Datenbank abfragen.

    Bei Änderungen sollte du allerdings nicht vergessen das Session array auch zu aktualisieren.

    Siehe dazu auch mein OOP Test Ausgabe Beispiel laden der Datenbank informationen.

    Quellcode

    1. ?>
    2. #Laden der Berechtigungen
    3. $sql="SELECT
    4. grup_id,grup_name,re_name,re_bez
    5. FROM
    6. admin_gruppen,admin_rechte,gruppen,rechte
    7. WHERE
    8. f_userid='1' AND
    9. grup_id=admin_gruppen.f_grupid AND
    10. admin_gruppen.f_grupid=admin_rechte.f_grupid AND
    11. rechte.re_id = admin_rechte.f_reid
    12. ORDER by grup_name";
    13. $obj= new Dbpdo();
    14. $stmt =Dbpdo::get_db()->query($sql);
    15. $gruppe="";
    16. while ($data = $stmt->fetch(PDO::FETCH_OBJ))
    17. {
    18. if($gruppe=="" || $gruppe == $data->grup_name)
    19. {
    20. $rechte[$data->re_name]=$data->re_bez;
    21. $gruppe=$data->grup_name;
    22. echo $gruppe."";
    23. }
    24. else
    25. {
    26. # Alle Rechte der Gruppe laden
    27. $grupobj= new Gruppe($rechte,$gruppe); # Gruppe erstellen
    28. unset($rechte);
    29. $user->addGruppe($grupobj,$gruppe); # Gruppe den User zuweisen
    30. # Weiter Gruppen daten einlesen
    31. $rechte[$data->re_name]=$data->re_bez;
    32. $gruppe=$data->grup_name;
    33. echo "else:".$gruppe."";
    34. }
    35. }
    Alles anzeigen


    Und wie wäre das dann mit der Navigation gehen...?^^


    Wenn du das Rechtesystem etwas genauer betrachtest wirst du feststellen das es in der Liste privilege und resource gibt
    resource gibt die ganze Seite an auf die Zugriffen werden soll .
    privilege gibt die einzelne Elemente an auf dieser Seite auf die zugegriffen werden darf.

    Das kann nun alles sein angefangen von deiner Navigation bis hin zu Formular einträgen oder anderen Aktionen auf der Seite.
    Siehe dir dazu die Seite Galerie im Beispiel an hier noch mal der ausschnitt davon.

    Hier darf die Rolle Admin auf die Aktionen unter privilege gelistet sind zugreiffen. ('del_picture','del_images','add_album',
    'save_album','album_photo','save_photoalbum' und so weiter)

    Quellcode

    1. // Galerie Verwaltung (Admin Rechte der Seite Galerie Verwaltung)
    2. 'admin1' => array(
    3. 'role' => 'admin',
    4. 'resource' => array('galerie'),
    5. 'privilege' => array('index','add_picture','add_images',
    6. 'del_picture','del_images','add_album',
    7. 'save_album','album_photo','save_photoalbum',
    8. 'del_album','del_alben','sort_album','sort_alben',
    9. 'sort_picture','multiadd_picture','nophoto_album',


    Mfg Splasch

    Ps ich hab dir das Er Diagram der Datenbank hier nochmal im Anhang eingespielt.
    Bilder
    • Diagram_admin.png

      24,73 kB, 718×437, 240 mal angesehen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von splasch ()

  • splasch schrieb:

    Fipsi schrieb:

    Ich bin gerade am überlegen, wie es am sinnvollsten is, so eine struktur mit Datenbank aufzubauen.

    Würde das gehen, wenn jedes mal wenn eine Seite aufgerufen wird, wird die Datenbank abgefragt, darf er diese Seite überhaupt sehen. Und jedes mal wird auch gleichzeitig überprüft, ob die aktuelle Rolle auch noch wirklich aktuell ist?
    Und wie wäre das dann mit der Navigation gehen...?^^

    P.S.: ich weiß, ich bin anstrengend, sry, aber ich bin noch im lernstadion :D


    Zur Datenbank Aufbau kannst du das fertige Er Diagram aus meinen OO Beispiel übernehmen wenn du willst. siehe php2all.de/thread-651-rechtesystem.html
    (Bild Anhang)


    Wenn ich das richtig sehe, dann gibts da ja eig. nur nen "normalen user" und nen "admin User"?

    splasch schrieb:

    Würde das gehen, wenn jedes mal wenn eine Seite aufgerufen wird, wird die Datenbank abgefragt, darf er diese Seite überhaupt sehen. Und jedes mal wird auch gleichzeitig überprüft, ob die aktuelle Rolle auch noch wirklich aktuell ist?


    Die Rolle ändert sich normal nicht während der ganzen Sitizung. Wenn deine Scripte Zentral aufgebaut sind reicht es aus einmal die Konfiguration zu laden.
    Wenn du unötige Datenbank zugriffe sparen willst. Kanst du auch das Array aus der Datenbank in die Session laden. So brauchst du nicht bei jeden Klick erneut die Datenbank abfragen.

    Bei Änderungen sollte du allerdings nicht vergessen das Session array auch zu aktualisieren.

    Siehe dazu auch mein OOP Test Ausgabe Beispiel laden der Datenbank informationen.


    Deswegen meinte ich, bei jedem Seitenladen die Datenbank erneut abrufen. Ich habe das z.Z., ich habe nur zwei Session: $_SESSION['eingeloggt'] und $_SESSION['id'], wenn $_SESSION['eingeloggt'] == TRUE wird bei jedem Seitenabruf alle user-daten mit der id $_SESSION['id'] erneut von der Datenbank abgerufen.

    splasch schrieb:

    Quellcode

    1. ?>
    2. #Laden der Berechtigungen
    3. $sql="SELECT
    4. grup_id,grup_name,re_name,re_bez
    5. FROM
    6. admin_gruppen,admin_rechte,gruppen,rechte
    7. WHERE
    8. f_userid='1' AND
    9. grup_id=admin_gruppen.f_grupid AND
    10. admin_gruppen.f_grupid=admin_rechte.f_grupid AND
    11. rechte.re_id = admin_rechte.f_reid
    12. ORDER by grup_name";
    13. $obj= new Dbpdo();
    14. $stmt =Dbpdo::get_db()->query($sql);
    15. $gruppe="";
    16. while ($data = $stmt->fetch(PDO::FETCH_OBJ))
    17. {
    18. if($gruppe=="" || $gruppe == $data->grup_name)
    19. {
    20. $rechte[$data->re_name]=$data->re_bez;
    21. $gruppe=$data->grup_name;
    22. echo $gruppe."";
    23. }
    24. else
    25. {
    26. # Alle Rechte der Gruppe laden
    27. $grupobj= new Gruppe($rechte,$gruppe); # Gruppe erstellen
    28. unset($rechte);
    29. $user->addGruppe($grupobj,$gruppe); # Gruppe den User zuweisen
    30. # Weiter Gruppen daten einlesen
    31. $rechte[$data->re_name]=$data->re_bez;
    32. $gruppe=$data->grup_name;
    33. echo "else:".$gruppe."";
    34. }
    35. }
    Alles anzeigen


    Also das funktioniert ja jez nur mit deinem anderem Code-teilen, weil des is ja n Teil aus dem OOP-teil, oder? (ich sag doch, mich mag OOP nich :D)

    splasch schrieb:

    Und wie wäre das dann mit der Navigation gehen...?^^


    Wenn du das Rechtesystem etwas genauer betrachtest wirst du feststellen das es in der Liste privilege und resource gibt
    resource gibt die ganze Seite an auf die Zugriffen werden soll .
    privilege gibt die einzelne Elemente an auf dieser Seite auf die zugegriffen werden darf.

    Das kann nun alles sein angefangen von deiner Navigation bis hin zu Formular einträgen oder anderen Aktionen auf der Seite.
    Siehe dir dazu die Seite Galerie im Beispiel an hier noch mal der ausschnitt davon.

    Hier darf die Rolle Admin auf die Aktionen unter privilege gelistet sind zugreiffen.


    Kann ich dazu auch ne Datenbank-tabelle machen und in der alles speichern? bzw. wie würde sowas dann ausschauen.

    Und was ich mit deinem Code auch noch nicht begriffen habe:

    Wie werden die Rechte dann eigentlich genau zugeordnet, bzw. wie heißen die Rechte?
  • Wenn ich das richtig sehe, dann gibts da ja eig. nur nen "normalen user" und nen "admin User"?


    Nein das Diagram ist für alle Rollen vollständig. Damals war es für Gruppen gedacht ist aber im grunde fast das selbe nur das es bei Gruppen mehre geben kann bei Rollen spricht man immer nur von einer pro user
    Wie die Tabellen namen benannt sind ist egal wobei die von mir damals nicht sehr passend bennant wurden. Entscheident ist die Userid das ist der User welche rolle du ihm dann zu weißt bleibt dir überlassen möglich sind endlos viele verschiedene Rollen. (admin, user,moderator und und)

    Also das funktioniert ja jez nur mit deinem anderem Code-teilen, weil des is ja n Teil aus dem OOP-teil, oder? (ich sag doch, mich mag OOP nich )


    Hier ging es mir in erste Linie um den Sql Befehl damit du sieht wie du die Daten abfragen kannst. Und die Sql Abfrage kannst du in deinen Script dann entsprechend auswerten ohne das du OO verwenden musst.
    Im Beispiel wird PDO verwendet für die Datenbank abfrage würd ich dir übrings auch empfehlen.
    siehe dazu : php.net/manual/de/book.pdo.php
    php.net/manual/de/pdo.prepare.php

    Kann ich dazu auch ne Datenbank-tabelle machen und in der alles speichern? bzw. wie würde sowas dann ausschauen.

    Und was ich mit deinem Code auch noch nicht begriffen habe:

    Wie werden die Rechte dann eigentlich genau zugeordnet, bzw. wie heißen die Rechte?


    Darin wird bereits alles gespeichert in dem Beispiel. Die rechte selbst sind den Rollen zugeordnet. Zur leichteren verständnis siehe dir dazu das Array an.
    Alle Rollen die User Besitzen und deren Rechte

    Mfg Splasch
  • Puh, langsam übersteigt das alles mein Verständnis, und ich krieg langsam Kopfweh davon...

    Ich glaube, ich nehm das jetzt einfach mal alles raus, kopier das in meinen Code, und versuch das dann zu verstehen.

    Nett wäre es nur auch zu wissen, wie die Rechte dann auch "zugeteilt" werden. Also ich mein jetzt, was mus sin die Datenbank eingetragen werden, damit er weiß, auf welches Recht er dem user zugestehen muss?
  • Fipsi schrieb:

    Puh, langsam übersteigt das alles mein Verständnis, und ich krieg langsam Kopfweh davon...

    Ich glaube, ich nehm das jetzt einfach mal alles raus, kopier das in meinen Code, und versuch das dann zu verstehen.

    Nett wäre es nur auch zu wissen, wie die Rechte dann auch "zugeteilt" werden. Also ich mein jetzt, was mus sin die Datenbank eingetragen werden, damit er weiß, auf welches Recht er dem user zugestehen muss?


    Vereinfacht gesagt brauchst du nur den Rollen Rechte zuweisen. Und die Rolle weißt du dann einfach den User x zu
  • so, also ich hab jetzt mal die kompletten Code's eingepackt, datenbank erstellt, und die letzte datei, die unter dem Link angegeben ist, nochmal in eine extra datei gepackt und ne funktion dazu gebastelt.

    Ich habe jetzt allerdings ein kleines Problem:

    Der sagt immer: Catchable fatal error: Argument 1 passed to User::addGruppe() must be an instance of Gruppe, null given, called in F:\Webserver\xampp\htdocs\data\templates\function\rechte\use.php on line 64 and defined in F:\Webserver\xampp\htdocs\data\templates\function\rechte\user.php on line 34
    (betrifft diese zeile: public function addGruppe(Gruppe $gruppe,$name))

    Die Datenbanken sind noch leer, da ich noch nicht so recht weiß, wie ich sie befüllen muss.

    Und wie genau muss ich das dann gleich ncchmal mit den Seiten machen? Die in eine Datenbank eintragen, und wie dann sagen, die rolle hat welches Recht?
  • Langsam hab ich den dreh raus, glaub ich:
    Gruppen und rechte gemacht, und diese Usern zugewiesen.
    jetzt muss ich eine Datenbank anlegen, in der alle seiten stehen, und welche rechte in ihn "herrschen".
    Jetzt habe ich glaube ich zumindest, das ganze begriffen.
    Wenn ich nochmal Probleme hab, melde ich mich nochmal
  • So, jetzt werd ich wohl erstmal nen Arschtritt kassieren, wegen dreifachpost, aber sonst könnte es überlesen werden.

    Also die Code's hab eich teilweise ein bisschen angepasst, so dass sie jetzt so ausschauen:

    user.php

    Quellcode

    1. class User extends Absgruppen
    2. {
    3. protected $user_id = 0;
    4. # Benutzer Nummer
    5. protected $user_name = '';
    6. # Benutzer Name protected
    7. /**
    8. * User Profil Eigenschaften füllen
    9. * @param $profil array
    10. * @return null */
    11. public function __construct($profil)
    12. {
    13. if(is_array($profil))
    14. {
    15. $this->user_id=$profil['id'];
    16. $this->user_name=$profil['name'];
    17. }
    18. return false;
    19. }
    20. /**
    21. * Neue Gruppe den User hinzufügen
    22. * @param $gruppe Objekt
    23. * @param $name String
    24. * @return void
    25. */
    26. public function addGruppe(Gruppe $gruppe,$name)
    27. {
    28. $this->setGruppe($gruppe,$name);
    29. }
    30. /**
    31. * Gibt das Angeforderte Gruppen Objekt zurück
    32. * @param $index String
    33. * @return gruppen Objekt
    34. */
    35. public function getGruppen($index)
    36. {
    37. return $this->gibGruppe($index);
    38. }
    39. /** * Gibt die Namen Aller Gruppen zurück
    40. * @param
    41. * @return array
    42. */
    43. public function getGrupNames()
    44. {
    45. return $this->gibGrupNames();
    46. }
    47. }
    Alles anzeigen


    absgruppen.php

    Quellcode

    1. abstract class Absgruppen
    2. {
    3. private $gruppen = array();
    4. # Gruppen Objekte private
    5. public $allName = array();
    6. # Namen aller Instanzierten Gruppen
    7. /**
    8. * Neue Gruppe den User hinzufügen
    9. * @param $gruppe Objekt
    10. * @param $name String
    11. * @return void
    12. */
    13. abstract public function addGruppe(Gruppe $gruppe,$name);
    14. /**
    15. * Neues Objekt der Gruppe in Array Speichern und den Gruppen Namen
    16. * @param $gruppe Objekt
    17. * @param $name String
    18. * @return void
    19. * Nur hinzufügen wenn das Objekt noch nicht vorhanden ist */
    20. function setGruppe(Gruppe $gruppe,$name)
    21. {
    22. if(is_object($this->gruppen[$name]))
    23. {
    24. #echo "Gruppe <b>".$name."</b> schon drin.";
    25. return;
    26. }
    27. $this->gruppen[$name]=$gruppe;
    28. $this->allName[]=$name;
    29. }
    30. /**
    31. * Gibt das Angeforderte Gruppen Objekt zurück
    32. * @param $index String
    33. * @return gruppen Objekt
    34. */
    35. function gibGruppe($index)
    36. {
    37. return $this->gruppen[$index];
    38. }
    39. /**
    40. * Gibt die Namen Aller Gruppen zurück
    41. * @param
    42. * @return array
    43. */
    44. function gibGrupNames()
    45. {
    46. return $this->allName;
    47. }
    48. }
    Alles anzeigen


    access.php

    Quellcode

    1. class Access
    2. {
    3. /**
    4. *
    5. * @param
    6. * @return null
    7. */
    8. public function __construct()
    9. {
    10. }
    11. /**
    12. * Pürfen ob der Zugriff zur Seite Erlaubt ist
    13. * @param $user Objekt
    14. * @param $seite String
    15. * @return bolean
    16. */
    17. public function zugang(User $user5,$seite)
    18. {
    19. # Session Prüfen
    20. if (!$this->checkSession())
    21. {
    22. return false;
    23. }
    24. foreach ($user->getGrupNames() as $gruppe)
    25. {
    26. if (array_key_exists($seite,$user5->getGruppen($gruppe)->getRechte()))
    27. {
    28. return true;
    29. }
    30. #echo "nicht enthalten in: ".$gruppe.ž;
    31. }
    32. return false;
    33. }
    34. /**
    35. * SESSION Prüfen
    36. * @return bolean
    37. */
    38. protected function checkSession()
    39. {
    40. if ((($_SESSION['eingeloggt'] == TRUE)&&($_SESSION['ip_adress'] != $_SERVER['REMOTE_ADDR'])||$_SESSION['eingeloggt'] != TRUE)&&(isset($_SESSION['id'])))
    41. {
    42. return false;
    43. }
    44. else
    45. {
    46. # Session Prüfung bestanden
    47. return true;
    48. }
    49. }
    50. //ende checkSession
    51. /**
    52. * Gibt alle Rechte aus allen Gruppen zurück
    53. * Führt die Rechte zusammen und Filtert doppelte Werte
    54. * @param
    55. * @return array
    56. */
    57. public function alleRechte(User $user)
    58. {
    59. $rechte=array();
    60. foreach ($user->getGrupNames() as $gruppe)
    61. {
    62. foreach ($user->getGruppen($gruppe)->getRechte() as $key=>$inhalt)
    63. {
    64. if(!array_key_exists($key,$rechte))
    65. {
    66. $rechte[$key]=$inhalt;
    67. }
    68. }
    69. }
    70. asort($rechte);
    71. return $rechte;
    72. }
    73. }
    Alles anzeigen


    dbpdo.php

    Quellcode

    1. class Dbpdo
    2. {
    3. private $uid = "f";
    4. #Benutzename
    5. private $pw = "";
    6. #Password
    7. private $serv = "";
    8. #Datenbank Server
    9. private $dbname = "";
    10. #Datenbank Name
    11. protected static $db_obj = null;
    12. #Datenbank Objekt PDO
    13. public $error;
    14. #Fehler Varibale
    15. /**
    16. * Klassen aufruf PDO verbindung aufbauen
    17. */
    18. public function __construct()
    19. {
    20. $db="mysql:dbname=".$this->dbname.";host=".$this->serv;
    21. #mysql:dbname=Datenbankname;host=localhost
    22. try
    23. {
    24. self::$db_obj = new PDO($db, $this->uid, $this->pw, array
    25. (
    26. PDO::ATTR_PERSISTENT => false,
    27. PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING
    28. #PDO::ERRMODE_EXCEPTION
    29. #PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
    30. )
    31. );
    32. }
    33. catch (PDOException $e)
    34. {
    35. $this->error='Fehler beim Öffnen der Datenbank: ' . $e->getMessage();
    36. echo $this->error;
    37. #Fehler ausgabe
    38. }
    39. }
    40. /**
    41. * Eine Instanz des PDO Objektes übergeben
    42. * @return Objekt $db_obj
    43. */
    44. public static function get_db()
    45. {
    46. if(is_null(self::$db_obj))
    47. {
    48. self::$db_obj = new Dbpdo();
    49. }
    50. return self::$db_obj;
    51. }
    52. }
    Alles anzeigen


    gruppe.php

    Quellcode

    1. class Gruppe
    2. {
    3. protected $re_name = array();
    4. # Beschreibungs Name des Zugriffs | Seitenkennung(id) für den Zugriff
    5. protected $gruppenName;
    6. # Name der Gruppe
    7. /**
    8. * Ladet Gruppen Rechte
    9. * @param $rename Array
    10. * @param $gruppe String
    11. * @return null
    12. */
    13. public function __construct($rename,$gruppe)
    14. {
    15. $this->re_name=$rename;
    16. $this->gruppenName=$gruppe;
    17. }
    18. /**
    19. * Gibt den Gruppenname wieder
    20. * @param null
    21. * @return String
    22. */
    23. public function getName()
    24. {
    25. return $this->gruppenName;
    26. }
    27. /**
    28. * Gibt den Rechte Namen wieder
    29. * @param null
    30. * @return array
    31. */
    32. public function getRechte()
    33. {
    34. return $this->re_name;
    35. }
    36. }
    Alles anzeigen


    use.php

    Quellcode

    1. require_once("dbpdo.php");
    2. require_once("gruppe.php");
    3. require_once("absgruppen.php");
    4. require_once("user.php");
    5. require_once("access.php");
    6. if ($_SESSION['eingeloggt'] == TRUE)
    7. {
    8. $profil = array("name"=>$user->username,
    9. "id"=>$_SESSION['id']);
    10. $user5 = new User($profil);
    11. }
    12. else
    13. {
    14. $profil = array("name"=>"guest",
    15. "id"=>"0");
    16. $user5 = new User($profil);
    17. }
    18. #Laden der Berechtigungen
    19. $sql="SELECT grup_id,grup_name,re_name,re_bez FROM admin_gruppen,admin_rechte,gruppen,rechte WHERE f_userid='1' AND grup_id=admin_gruppen.f_grupid AND admin_gruppen.f_grupid=admin_rechte.f_grupid AND rechte.re_id = admin_rechte.f_reid ORDER by grup_name";
    20. $obj= new Dbpdo();
    21. $stmt =Dbpdo::get_db()->query($sql);
    22. $gruppe="";
    23. while ($data = $stmt->fetch(PDO::FETCH_OBJ))
    24. {
    25. if($gruppe=="" || $gruppe == $data->grup_name)
    26. {
    27. $rechte[$data->re_name]=$data->re_name;
    28. $gruppe=$data->grup_name;
    29. #echo $gruppe."";
    30. }
    31. else
    32. {
    33. # Alle Rechte der Gruppe laden
    34. $grupobj= new Gruppe($rechte,$gruppe);
    35. #Gruppe erstellen
    36. unset($rechte);
    37. $user5->addGruppe($grupobj,$gruppe);
    38. # Gruppe den User zuweisen
    39. # Weiter Gruppen daten einlesen
    40. $rechte[$data->re_name]=$data->re_name;
    41. $gruppe=$data->grup_name;
    42. #echo "else:".$gruppe."";
    43. }
    44. }
    45. #Letzte Gruppe erstellen falls vorhanden
    46. if (is_array($rechte))
    47. {
    48. $grupobj= new Gruppe($rechte,$gruppe);
    49. # Gruppe erstellen
    50. $user5->addGruppe($grupobj,$gruppe);
    51. # Gruppe den User zuweisen
    52. #echo "last:".$gruppe."";
    53. }
    54. #echo $user5->getGruppen('Super Admininstrator')->getName()."";
    55. $access = new Access();
    56. function zugang_check_seite($access, $user5, $seite, $seiten_inhalt)
    57. {
    58. if(!$access->zugang($user5,$seite))
    59. {
    60. $seiten_inhalt = "<br />Failure<br />";
    61. }
    62. return;
    63. }
    Alles anzeigen


    Und das steht in der Datei, die angezeigt wird:

    zugang_check_seite($access, $user5, "index_lesen", $seiten_inhalt)

    Ich habe jetzt ein Problem:

    Wenn ich nicht eingeloggt bin, erhalte ich problemlos das Recht zum lesen und kann die Seite auch sehen.
    Bin ich allerdings eingeloggt, erhalt eich zwar auch das Recht, steht zumindest genauso in print_r($user5) drin, allerdings wird mir dann der Teil ohne Zugriffsrecht angezeigt.

    Das steht in print_r($user5):

    User Object ( [user_id:protected] => 1 [user_name:protected] => Fipsi [gruppen:Absgruppen:private] => Array ( [Absoluter Administrator] => Gruppe Object ( [re_name:protected] => Array ( [index_edit] => index_edit [index_lesen] => index_lesen ) [gruppenName:protected] => Absoluter Administrator ) ) [allName] => Array ( [0] => Absoluter Administrator ) )

    Danke schonmal :)
  • Hi,
    Dbpdo construct solltest du private machen
    methoden solltest du englisch machen.

    zwischen den methoden herrscht ein ziemlich chaos.. warum ruft getgruppe die gibgruppe auf?
    Kann es sein, dass die parent nicht geläufig ist?
    In der Klasse User musst du wahrscheinlich nur den Konstruktor überschreiben.

    use.php und zugang_check_seite sind nur Beispiele, oder?
    Ich verstehe nicht warum du auf nicht objektorientieren Code zurückgreifen möchtest.
    Sämtliche Datenbankzugriffe gehören in das Model.

    Ansonsten: Wo ist das Problem beim Gast Benutzer? Allein durch den Session check muss doch false returned werden?
    Ansonsten hast du da ein paar falsche Bedingungen - der Test sieht sehr kompliziert aus

    Quellcode

    1. if ($_SESSION['eingeloggt'] != TRUE || !$_SESSION['id'] || $_SESSION['ip_adress'] != $_SERVER['REMOTE_ADDR']) {
    2. return false;
    3. }
  • Torben Brodt schrieb:

    Dbpdo construct solltest du private machen


    Wenn ich das contruct auf private macht gibt er mir n error aus wegen "$obj= new Dbpdo(); " in use.php

    Torben Brodt schrieb:

    zwischen den methoden herrscht ein ziemlich chaos.. warum ruft getgruppe die gibgruppe auf?
    Kann es sein, dass die parent nicht geläufig ist?


    Ich habe mich acuh schon drüber gewundert, aber der Code ist von splash, und da ich mich in OOP noch nich sonderlich auskenn wollt ich da nicht drin rumwursteln.

    Torben Brodt schrieb:

    use.php und zugang_check_seite sind nur Beispiele, oder?
    Ich verstehe nicht warum du auf nicht objektorientieren Code zurückgreifen möchtest.
    Sämtliche Datenbankzugriffe gehören in das Model.


    Wie, sind nur Beispiele? die use.php wird überall mcih eingebunden, und über zugang_check_seite überprüf ich dann, ob etwas angezeigt wird, oder nicht.
    Und was meinst du mit "Sämtliche Datenbankzugriffe gehören in das Model."? Soll ich die SQL-Abfrage also in n Object mit einbauen? Wenn ja, in welches?

    Torben Brodt schrieb:

    Ansonsten: Wo ist das Problem beim Gast Benutzer? Allein durch den Session check muss doch false returned werden?
    Ansonsten hast du da ein paar falsche Bedingungen - der Test sieht sehr kompliziert aus

    Quellcode

    1. if ($_SESSION['eingeloggt'] != TRUE || !$_SESSION['id'] || $_SESSION['ip_adress'] != $_SERVER['REMOTE_ADDR']) {
    2. return false;
    3. }


    Ich hab gerade die Bedingung selber abgeändert, da ich Fehler in der Klammersetzung entdeckt habe (access.php Zeile 44) auf "((($_SESSION['eingeloggt'] == TRUE)&&($_SESSION['ip_adress'] != $_SERVER['REMOTE_ADDR']))||(($_SESSION['eingeloggt'] != TRUE)&&(isset($_SESSION['id']))))", was jetzt eigentlich richtig sein sollte, und dann das true mti false ausgetauscht. Jetzt wird zwar die Seite, die angezeigt werden soll eingeloggt angezeigt, aber dafür nicht mehr, wenn man ausgeloggt ist.

    Edit: letztes Problem gerade gelöst:
    Ich habe die in der $_SESSION gespeicherte IP-Adresse verschlüsselt, die $_SERVER['REMOTE_ADDR'] war abe rnoch unverschlüsselt. *facepalm*

    Ich check das Problem nicht 8|

    Edit: weitere Problemlösungen:

    In der SQL-Abfrage ist für die Userid schon ein fester wert (1) vorgegeben, dieser wurde jettz auf $profil_id ($profil_id = $profil['id']) abgeändert.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Fipsi ()

  • $obj = new Dbpdo solltest du auch nicht machen, stattdessen
    $obj = Dbpdo::get_db();

    Und was meinst du mit "Sämtliche Datenbankzugriffe gehören in das Model."? Soll ich die SQL-Abfrage also in n Object mit einbauen? Wenn ja, in welches?

    Den ganzen use.php kannst du in

    Quellcode

    1. class Access {
    2. ...
    3. public statuc function check_seite() {
    4. HIEREIN
    5. }


    machen

    und an der entsprechenden Stelle nur noch Access:check_seite() aufrufen.
  • Torben Brodt schrieb:

    $obj = new Dbpdo solltest du auch nicht machen, stattdessen
    $obj = Dbpdo::get_db();


    =>

    Quellcode

    1. $obj= new Dbpdo();
    2. $stmt =Dbpdo::get_db()->query($sql);


    Hab ich doch?? Wenn ich die erste Zeile streich geht nix.

    Quellcode

    1. class Access {
    2. ...
    3. public statuc function check_seite() {
    4. HIEREIN
    5. }


    machen

    und an der entsprechenden Stelle nur noch Access:check_seite() aufrufen.



    Stimmt, psar ich mir ne menge Variablenübergabe... mach ich gleich :)

    Edit: damit wären wir wieder beim Thema, ich bin zu blöd für OOP: letzteres krieg ich wieder mal nich auf die reihe, aber da es auch so geht, wie ichs jez hab, lass ichs so

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Fipsi ()

  • Fipsi schrieb:

    get_db()

    Fipsi schrieb:

    Torben Brodt schrieb:

    $obj = new Dbpdo solltest du auch nicht machen, stattdessen
    $obj = Dbpdo::get_db();


    =>

    Quellcode

    1. $obj= new Dbpdo();
    2. $stmt =Dbpdo::get_db()->query($sql);


    Hab ich doch?? Wenn ich die erste Zeile streich geht nix.

    Quellcode

    1. class Access {
    2. ...
    3. public statuc function check_seite() {
    4. HIEREIN
    5. }


    machen

    und an der entsprechenden Stelle nur noch Access:check_seite() aufrufen.



    Stimmt, psar ich mir ne menge Variablenübergabe... mach ich gleich :)

    Edit: damit wären wir wieder beim Thema, ich bin zu blöd für OOP: letzteres krieg ich wieder mal nich auf die reihe, aber da es auch so geht, wie ichs jez hab, lass ichs so

    Fipsi
    Du musst die Datenbank Klasse Statisch aufrufen. Und dir zu erst eine Instantz davon holen.

    Statt:

    Quellcode

    1. $obj= new Dbpdo();

    Schreibst du:

    Quellcode

    1. $db = Dbpdo::get_db();
    2. $db->query($sql);



    Hier hast du nee kleine Erweiterung von der Db Klasse wenn du was veränderst an den Klassen sollte du auch verstehen was du da machst.

    Quellcode

    1. <?php
    2. /**
    3. * Datenbank Klasse
    4. * @version 1.1
    5. * @author Splasch
    6. * Filename: dbpdo.php
    7. * Verbindung über die PDO herstellen
    8. **/
    9. class Dbpdo
    10. {
    11. private $uid = dbuid; # Benutzename
    12. private $pw = dbPw; # Password
    13. private $serv = dbServ; # Datenbank Server
    14. private $dbname= dbname; # Datenbank Name
    15. protected static $db_obj = null; # Datenbank Objekt PDO
    16. public $error; # Fehler Varibale
    17. private $anfragen; # Sql Anfragen zählen
    18. /**
    19. * Klassen aufruf PDO verbindung aufbauen
    20. *
    21. */
    22. private function __construct()
    23. {
    24. $db="mysql:dbname=".$this->dbname.";host=".$this->serv; #mysql:dbname=Datenbankname;host=localhost
    25. try
    26. {
    27. self::$db_obj = new PDO($db, $this->uid, $this->pw,array
    28. (
    29. PDO::ATTR_PERSISTENT => false,
    30. PDO::ATTR_ERRMODE => PDO::ERRMODE_WARNING #PDO::ERRMODE_EXCEPTION
    31. #PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true
    32. )
    33. );
    34. }
    35. catch (PDOException $e)
    36. {
    37. $this->error='Fehler beim Öffnen der Datenbank: ' . $e->getMessage();
    38. echo $this->error; #Fehler ausgabe
    39. }
    40. }
    41. /**
    42. * Eine Instanz des PDO Objektes übergeben
    43. * @return Objekt $db_obj
    44. */
    45. public static function get_db()
    46. {
    47. if(is_null(self::$db_obj))
    48. {
    49. self::$db_obj = new Dbpdo();
    50. }
    51. return self::$db_obj;
    52. }
    53. /**
    54. * exec
    55. * Auch exec Anfragen mit zählen
    56. * @param sql (string)
    57. **/
    58. public function exec($sql)
    59. {
    60. $this->anfragen ++;
    61. return parent::exec($sql); // Funktion der Eltern Klasse zurückgeben
    62. }
    63. /**
    64. * execute
    65. * Auch execute Anfragen mit zählen
    66. * Nach prepare
    67. * @param params (array)
    68. **/
    69. public function execute($params = array())
    70. {
    71. $this->anfragen ++;
    72. return parent::execute($params);
    73. }
    74. /**
    75. * get_anfragen
    76. * Gesamt Sql anfragen zurück geben
    77. **/
    78. public function get_anfragen()
    79. {
    80. return $this->anfragen;
    81. }
    82. } // Ende Klasse
    83. ?>
    Alles anzeigen


    Noch ein Tip zu den Klassen von mir verwende __autoload() damit ersparst du dir das ganze manuele Nachladen der Klassen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von splasch ()