Logisches Problem

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Logisches Problem

    Hi @all

    ich habe ein Problem mit meinem Administrationsaufbau. Hier im Forum wurde vor Kurzem eine, wie mir anfangs schien, gute Möglichkeit besprochen, eine Administration aufzubauen - über DB.

    http://www.php-resource.de/forum/sho...threadid=21167

    Ich hatte diesen Gedanken weiterverfolgt bis ich zur Schlußfolgerung kam, dass dieser Aufbau usw nicht das richtige für meine Zwecke sind. Jedoch habe ich es so ähnlich gemacht:

    Ich habe verschiedene Kategorien die von Usern administriert werden, mit verschiedenen Rechten.
    Als Beispiel: Es gibt eine Newsgroup die von "Teamleitern" und von "Teammitarbeitern" geleitet wird. Die Aufgabe von den Teamleitern (so wie ich sie jetzt bspw. nenne) ist, die Angelegenheiten der einzelnen Teammitarbeitern zu klären usw - es gibt also so etwas wie eine Hierachie. Unter einem Teamleiter stehen vielleicht 3 oder 4 Mitarbeiter, die sich eben um News und Artikel kümmern.

    Ich hoffe ihr konntet mir bisher folgen. Mein Prinzip also:
    Systemadministrator >> Teamleiter >> Teammitarbeiter

    Anstatt Newsgroup hat es noch die Administration, die von einem Systemadministrator (in der Hierarchie der Oberste) und einem Systemmoderator, der stellvertretend für den admin ist. Dieses Prinzip soll später auf Forum und Chat ausgeweitet werden.

    Hier mein Versuch das in die DB einzubauen:

    TABELLE cw_userrechte:
    gid
    sid
    uid

    ziemlich unspektakulär:
    gid ist die gruppen-id, d.h. Administration ist gruppe 1, Newsgroup ist Gruppe 2, Chat ist Gruppe 3 usw...

    sid ist die status-id, d.h. für NEwsgroup bspw ist sid = 1 Teamleiter, sid = 2 ist Teammitarbeiter

    uid ist user-id, die aus einer anderen Tabelle stammt (cw_user)...
    Bsp.: der User mit der uid 4 hat den Status 1 in der Gruppe 2 = CrazyPip ist Teamleiter in der Newsgroup.

    Wenn ich nun in mein Admin-Panel gehe, von wo aus alles gesteuert werden kann, dann stellt sich bei mir die Frage, wie ich das alles unter einen Hut bekomme, so wie ich das möchte.

    wenn ich die WErte aus der DB hole, dann speicher ich diese in ein assoziatives Array ab:

    PHP-Code:
        $ur $usr->sql("SELECT gid, sid FROM cw_userstatus WHERE uid = " $login['uid']);
        
        if (
    mysql_num_rows($ur) > 0)
        {
            
    $arr = array();
            
            while (
    $get mysql_fetch_array($ur)) 
            {
                
    $arr[$get['sid']] = $get['gid'];
            }
        
        }
        else
        {
            
    header("Location:".$path."/index.php");
        } 
    nun stehen der status mit der dazugehörigen gruppe in einem array. Somit ist sichergestellt, dass ein Benutzer mehreren Kategorien mit verschiedenen Rechten angehören kann.

    Ab hier komme ich nicht mehr weiter. Ich habe nichts weiter wie statusid und gruppenid. Wie mache ich nun am besten weiter, damit ich aus diesen Werten ein panel aufbauen kann, das diese Hierachie beinhaltet. Mein Versuch war es sehr viele Arrays zu erstellen, deren Namen aus sid und gid zusammensetzt, sodass ich damit dann explizit auf den entsprechenden zugreifen kann. Aber das werden dann im endeffekt zu viele Arrays und das ist, wenn ich was ändern möchte, viel zu umständlich.
    Weis einer von euch, wie ich mein Panel am besten aufbauen könnte? (Kategorien > an status angepasste optionen bsp. teamleiter hat mehr optionen wie teammitarbeiter)

    Wäre echt dankbar

    cya CrazyPip

    p.s. sorry wegen dem langen text...

  • #2
    hi!

    was spricht dagegen, numerische userlevels zu vergeben?
    ausgehend von 10 stufen könntest festlegen, user vom offset 0-3 haben diese und jene rechte, von 4-7 andere rechte ... usw.

    je mehr stufen, desto feiner kannst du deine rechte auflösen.

    in der db gäbe es sann pro user nur noch eine tabelle mit seinen rechten.

    gruss,
    beebob

    Kommentar


    • #3
      hi

      sorry das ich mich erst jetzt melde - hatte bis jetzt keine Zeit für Inet!
      Danke für die Antwort erstmal!

      ja so in der art wollte ich das ja machen. Das Problem ist nur, dass es verschiedene Kategorien gibt die zu kontrollieren sind.

      Bsp:
      Kat 1 = Chat
      Kat 2 = Galerie
      Kat 3 = Newsgroup
      Kat 4 = Forum
      ...

      so möchte ich ein system entwickeln, welche meine vorher beschriebene Hierarchie (Teamleiter unter dem mehrere Mitarbeiter arbeiten) miteinbezieht.

      Das ist im Prinzip das, was du vorgeschlagen hast @beebob

      Mein Ansatz ist wie oben schon beschrieben in der DB folgender:
      gid ist die Gruppenid bzw. Kat id (1 =chat usw...)
      sid ist die statusid (bsp.1 = teamleiter , 2 = teammitarbeiter)
      uid ist die userid...

      nun weiss ich nicht mehr weiter wie ich am besten wetermache. Ich könnte arrays erstellen die sich aus status und gruppe zusammensetzen:
      PHP-Code:
      // Array für den mitarbeiter erste Zahl ist gruppenid und zweite Zahl ist Statusid
      $s_1_2 = array(
      "createnews" => "News erstellen",
      "createarticle" => "Artikel verfassen"
      );

      // und hier das(der/die...was auch immer) array für den Teamleiter 
      $s_1_1 = array(
      "createnews" => "News erstellen",
      "createarticle" => "Artikel verfassen",
      "controlmember" => "Team bearbeiten"
      ); 
      wenn ich das so hätte könnte ich mit einer foreach schleife alle dem User berechtigten links ala
      PHP-Code:
              foreach (${"s_".$gruppe."_".$status} as $a => $b)
              {
                  echo 
      "<a href=\"".$link."admin/panel.php?cat=".$cat_a[$x]."&cmd=".$a."\">".$b."</a><br>";
              } 
      anzeigen - so sieht mein aufbau im moment aus. Das ist sicher nicht die beste lösung (würds aber zur Not auch tun), wobei anpassung und performance usw bei vielen staten und Kategorien ziemlich schwierig wird...

      gibt es eine bessere, genauso funktionierende alternative zu der meinigen?

      cya CrazyPip

      Kommentar


      • #4
        ja ok, mit groupid kannste zweimal solche folgen nehmen.

        z.b.

        folge 0,..,9 für user
        folge 0,..,9 für gruppen

        dann 'mixte' das quasi:

        Function: {0,...,9} X {0,...,9} -> array(value_1,value_2,...,value_n)

        z.b.
        (0,0) = nein
        (0,1) = ja
        (0,2) = nein
        ...
        (1,0) = nein
        (1,1) = ja
        ...
        (9,9) = ja

        Je nach permission füllst du dann dein array oben mit den entsprechenden werten. sammelst also qausi deine ja's und nein's auf.

        je feiner du das granulierst, desto mehr möglichkeiten hast du und das ganze kann dynamisch wachsen/schrumpfen indem du jeweils den offset verschiebst.

        Kommentar


        • #5
          hi

          sehr interessanter Ansatz @beebob...danke dir!!!

          KAnnst du das mit den Folgen nochmal weiter ausführen? hab das nicht komplett verstanden was du mit "Folgen" meinst?

          (0,0) = nein
          (0,1) = ja
          (0,2) = nein


          mit diesen in den Klammern stehende Zahlen meinst du (gid,sid), oder?

          cya CrazyPip

          Kommentar


          • #6
            yo, meine ich.

            function check (userid,gid,sid) { ... }

            so war das gedacht.

            du kannst dann in der user tabelle hingehen und die ja's und nein's mit nullenn und einsen darstellen. legst meinetwegen 2 char felder mit jeweils der länge 10 an und dann ist da für die gid = 0000111000, sid = 100010000

            brauchst also nur 1x den satz aus deiner db/file zu holen und in einem rutsch laufen zu lassen.

            Kommentar


            • #7
              *text lösch und beebobs antwort nochmal durchles*

              ok ich glaub jetzt weiss ich wie du es meinst. Also gid besteht aus 10 (bsp 9) Zeichen...bsp.: 000211200 und sid aus bspw. 132465789. Nun übergebe ich diese Variablen nachdem ich sie aus der DB geholt habe, der Funktion als Parameter und dort trenne ich sie bspw. per explode...

              ich versuche es grade mal zu rekonstruieren:

              PHP-Code:

              function check($uid,$gid,$sid)
              {

              // aus Gesamten mach Einzelne
              $ggid explode("",$gid);
              $ssid explode("",$sid);


              for (
              $i=0,$i>=count($ggid);$i++)
              {

              echo 
              $ggid[$i] . " gehört zu " $ssid[$i];

              }



              so nun hab ich hier den gid Werten die richtigen sid Werten zugewiesen...bzw. halt angezeigt.

              Aber wie kann ich aus der funktion check meine Rechte verteilen? musst es nicht unbedingt coden...es würde mir schon helfen wenn du es mit worten aufzählen könntest wie ich vorgehen kann. Ich finde die Idee wirklich brauchbar, da dann auch die DB nicht allzuarg überlastet wird...

              cya CrazyPip

              Kommentar


              • #8
                feld permissions in der tabelle mit nullen und einsen anlegen.

                z.b.
                permissions: 1010000000101000000010100000001010000000101000000010100000001010000000101000000010100000001010000000

                (0,0) = 1
                (0,1) = 0
                (0,2) = 1
                u.s.w.

                *update*
                der laufindex von (x,y) ist dann also die id der einzelnen permission.
                sobald du den gesuchten gefinden hast (z.b. (0,0)) returnst du ja oder nein.

                das sind dann jeweils die ausgaben von check.
                kannst die perms check übergeben oder per global in die func rein holen.
                sorry die $uid muss gar nicht übergeben werden, weil du dir ja vorher von einem user die perms holst. ist also eindeutig.

                mist, wies hab ich das mit meinem cms nicht so gemacht?
                Zuletzt geändert von beebob; 15.07.2003, 18:00.

                Kommentar


                • #9
                  hi

                  irgendwie blicke ich da nicht durch...aber ich möchte es, deswegen bleib ich hartnäckig

                  feld permissions in der tabelle mit nullen und einsen anlegen.
                  wie meinst du das? also das Feld zusätzlich zu gid und sid hintzfügen? oder eine ganz neue Tabelle machen?

                  der laufindex von (x,y) ist dann also die id der einzelnen permission.
                  sobald du den gesuchten gefinden hast (z.b. (0,0)) returnst du ja oder nein.
                  du meinst, wenn ich diese Zahlenkette von permissions an die function check übergebe, diese dann zerlege, dann müssen alle Werte über eine Schleife überprüft werden, bzw. irgendwo zugeordnet werden...kannst du das bitte nochmal näher erläutern?

                  was sind "perms" ?

                  mist, wies hab ich das mit meinem cms nicht so gemacht?
                  gg kannst ja noch umschreiben!?

                  cya CrazyPip

                  Kommentar


                  • #10
                    yo, neues feld in deiner user tabelle anlegen.

                    die anzahl der nullen und einsen entspricht der anzahl der gid's * sid's.
                    daher auch die länge 100 der permissions in meinem posting. (waren ja {0,..,9} x {0,..,9} = 100 kombinationsmöglichkeiten)

                    laufindex:

                    du durchläufst zuerste alle möglichkeiten von (0,0) bis (9,9)

                    1: (0,0)
                    2: (0,1)
                    ...
                    100: (9,9)
                    ^^^ das ist der laufindex.

                    wenn du jetzt meinetwegen die permission für (4,5) rauskriegen willst, lässt du die gegeneinander laufen und der laufindex, der bei (4,5) rauskommt, ist die stelle, an der du dir die permission abholst.

                    bei (0,0) wäre das z.b. die die erste stelle in deiner nullen und einsen kette.

                    anhand dieser info kannst du dir ganz am schluss dein array zusammenbauen.

                    perms sind permissions (keine pömps)


                    ich kanns dir heut abend auch gerne schreiben, bin zu faul heut was zu lernen


                    beebob
                    Zuletzt geändert von beebob; 16.07.2003, 19:06.

                    Kommentar


                    • #11
                      vom Prinzip her verstehe ich das jetzt.

                      Aber wie soll das in der Praxis aussehen? Nehmen wir mal an, ein User hat in
                      (2,1)
                      (3,2)
                      (5,1)

                      ein true, d.h. er hat in Gruppe 2 das Recht 1, in Gruppe 3 das Recht 2 und in Gruppe 5 das Recht 1, wie soll ich dann weitermachen mithilfe dieses Arrays, welches mir die Funktion check zurückgibt -> ich habe ja nichts anderes wie diese Zahlen...wie ordne ich diese Zahlen und "Perms" die in diesem Array stehen (assoziativ?) verschiedene Kategorien zu?

                      Ja für ein Codebeisiel wäre ich sehr dankbar...

                      cya CrazyPip

                      Kommentar

                      Lädt...
                      X