Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] auf Benutzer- und Gruppenberechtigungen Bezug nehmen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] auf Benutzer- und Gruppenberechtigungen Bezug nehmen

    Moin,

    Leider ist der Titel nicht sehr aussagekräftig, da ich die Problematik nicht so kurz zusammengefasst bekomme, sorry.

    Also, worum geht's?
    Ich habe eine Tabelle mit verschiedenen Einträgen ( Webportale ), denen über weitere Tabellen Benutzer und Gruppen zugewiesen werden.
    Über eine Maske sollen alle Einträge dargestellt werden, die dem aktuellen Benutzer zugeordnet sind.
    Der Benutzer kann allerdings auch über eine Gruppe zugewiesen sein, was nicht zur doppelten Anzeige führen darf.

    Aufbau der Tabellen ( nur relevante Spalten! )
    Code:
    Portale
    Id|Portal|Weblink
    
    PortaleBenutzerZuordnung
    Id|PortalId|BenutzerId
    
    PortaleGruppen
    Id|Gruppe|erstellt
    
    PortaleGruppenBenutzer
    Id|GruppenId|BenutzerId
    
    PortaleGruppenZuordnung
    Id|PortalId|GruppenId
    Beispiel-Szenario
    Als Beispiel nehme ich mal das Portal http://www.example.com, das sowohl dem Benutzer hanswurst ( Id: 1 ) und der Gruppe Administratoren ( Id: 1 ), in dem sich hanswurst ebenfalls befindet, zugeordnet ist.

    Generell könnte ich nun natürlich herausfinden, welche Portale alle für Administratoren zugänglich sind:
    Code:
    SELECT
        Portale.Id,
        Portale.Portal,
        Portale.Weblink,
        PortaleGruppen.Gruppe
    
    FROM
        Portale
    JOIN
        PortaleGruppenZuordnung
        ON Portale.Id = PortaleGruppenZuordnung.PortalId
    JOIN
        PortaleGruppen
        ON PortaleGruppenZuordnung.GruppenId = PortaleGruppen.Id
    JOIN
        PortaleGruppenBenutzer
        ON PortaleGruppen.Id = PortaleGruppenBenutzer.GruppenId
    
    WHERE
        PortaleGruppenBenutzer.BenutzerId = 1
    Das gleiche funktioniert natürlich auch auf Benutzerebene.

    Was ist mein Problem?
    Mein Problem ist eben der Fall, daß sowohl der Benutzer hanswurst und seine Gruppe Administratoren einigen Portalen zugewiesen sind.
    Ich muß gestehen, daß ich echt grad nicht weiterkomme, wie ich das über eine Anweisung bewerkstellige, ohne die Einträge in dem Fall doppelt zu bekommen?!

    Allgemein
    Es handelt sich mal wieder um T-SQL ( MSSQL-Server 2008 R2 ).
    Antworten, wie es mit anderen Systemen machbar ist, nehme ich aber gerne auch an, da sie mir bei der Suche nach einer Lösung weiterhelfen könnten.

    Der angemeldete Benutzer ist für mich verfügbar.


    Danke für Anregungen und Hilfen
    Gruß Arne
    Competence-Center -> Enjoy the Informatrix
    PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

  • #2
    Hier etwas (ungetesteter) Konzeptcode mit abweichenden und vielleicht klareren Namen:

    PHP-Code:
    SELECT
        p
    .id
    FROM
        Users u
    LEFT JOIN
        UsersToGroups utg ON utg
    .userId u.id
    LEFT JOIN
        Groups g ON utg
    .groupId g.id
    LEFT JOIN
        UsersToPortals utp ON utp
    .userId u.id
    LEFT JOIN
        GroupsToPortals gtp ON gtp
    .groupId ug.id
    INNER JOIN
        Portals p ON p
    .id utp.portalId OR p.id gtp.portalId)
    GROUP BY
        p
    .id 

    Kommentar


    • #3
      Ok, danke für den Ansatz.
      Eine Tabelle Users gibt es so leider nicht, aber evtl. muß ich die dann erstellen.
      Competence-Center -> Enjoy the Informatrix
      PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

      Kommentar


      • #4
        Nein, nicht unbedingt.
        Konnte ich denn das Prinzip grundsätzlich verdeutlichen?
        Du brauchst zunächst die Tabellen, die beschreiben, welcher Benutzer und welche Gruppe zu welchem Projekt gehören - aber nur die Gruppen, die auch dem fraglichen Benutzer zugeordnet sind. Dann hast du durch das LEFT JOIN entweder Gruppen gefunden, oder die gefundenen betreffenden Spalten bleiben NULL.
        Dann joinst du mit dem Ergebnis an die Projekttabelle und holst dir alle Projekte, die entweder dem User, oder einer seiner Gruppen zugeordnet sind.

        Kommentar


        • #5
          Grundsätzlich habe ich verstanden, was Du meinst. Hatte auch schonmal überlegt, das ganze anders herum anzugehen.
          Hast Du noch irgendeinen JOIN geklammert? Ich sehe da eine schliessende Klammer hinter
          Code:
          Portals p ON p.id = utp.portalId OR p.id = gtp.portalId)
          , dazu aber keine öffnende?!


          EDIT:
          Ok, so rum erhalte ich gewünschte Ergebisse, danke!
          Competence-Center -> Enjoy the Informatrix
          PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

          Kommentar


          • #6
            Kurze Info für denjenigen, der meint das hier anonym negativ bewerten zu müssen mit dem Hinweis "Dann benutz endlich eine richtige Datenbank!":
            Ich kann keine andere DB dafür verwenden, weil unsere Warenwirtschaft darauf aufbaut!

            Erst denken und dann bewerten...
            Competence-Center -> Enjoy the Informatrix
            PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

            Kommentar


            • #7
              Was hat die Datenbank mit diesem Problem zu tun?!? Vielleicht ginge das mit MongoDB einfacher, aber mit RDBMS?

              Kommentar


              • #8
                Frag mich nicht, irgend jemand hat den Eingangspost negativ bewertet:
                Code:
                "Es handelt sich mal wieder" → Dann benutz endlich eine richtige Datenbank!



                ...tja, keine Ahnung. Nun hat jemand meine Reaktion positiv bewertet, allerdings auch anonym!
                Vermutlich sind hier noch einige im Halloween-Rausch...
                Competence-Center -> Enjoy the Informatrix
                PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

                Kommentar

                Lädt...
                X