• Hallo!

    Ich möchte Zugriffsrechte für bestimmte Daten in einer MySQL-Datenbank speichern. Hierfür dachte ich mir, dass man bei jeder Aktion speichert, welche speziellen Benutzer und welche Gruppen von Benutzern sie für welchen Datensatz durchführen können.
    Mit einigen Tabellen habe ich das auch hinbekommen, ich bin allerdings sicherlich kein (My)SQL-Guru und mich würde sehr interessieren, ob vielleicht jemand eine bessere Idee hat (insbesondere meine Abfragen mit Sub-Selects sehen recht komplex aus). Wenn mir jemand sagen würde, dass es so in Ordnung ist - auch kein Problem. ;)

    Ich habe mal ein kleines Beispiel konstruiert:
    -articles: Die Daten, für deren Zugriff Rechte verwaltet werden müssen.
    -users: Die Benutzer mit Namen.
    -groups: Benutzergruppen mit Namen.
    -belonging: n:m-Relation zwischen users und groups.
    -acl_users_articles_read: n:m-Relation zwischen den Artikeln und den Benutzern, die sie lesen dürfen.
    -acl_groups_articles_read: n:m-Relation zwischen den Artikeln und den Gruppen, deren Mitglieder sie lesen dürfen.

    Die Tabellen (MySQL-Export):

    Eine Abfrage (uid ist dabei die Benutzer-ID für die gefiltert wird):

    SQL
    SELECT *  FROM articles
      WHERE uid IN
        (SELECT acl_users_articles_read.userid FROM acl_users_articles_read
          WHERE acl_users_articles_read.articleid = articles.id)
      OR uid IN
        (SELECT belonging.userid FROM belonging
          WHERE belonging.groupid IN
            (SELECT acl_groups_articles_read.groupid FROM acl_groups_articles_read
              WHERE acl_groups_articles_read.articleid = articles.id)
        )

    Danke im Voraus!

    The User

  • solange die Abfrage funktioniert, passt das schon ;)
    Insgesamt finde ich es von daher umständlich, dass es nur für ein bestimmtest Szenario funktioniert. Hast du dir schon mal die ACL-Lösungen von Zend_Acl oder PEAR_LiveUser angesehen?


  • Was meinst du mit einem "bestimmten Szenario"? Meinst du, dass man ein bestimmtes Standard-Verhalten hinzufügen könnte? Oder anhand welcher Felder die Rechte zugeordnet werden? Oder etwas mit Deny-Listen, oder...?

  • du fragst explizit ab, ob ein Nutzer Rechte für einen bestimmten Artikel hat. Sobald du dann vielleicht eine Produktbeschreibung oder was auch immer hast, musst du den Spaß wieder abfragen.
    Besser finde ich es, dass zu abstrahieren, wie es in einigen objektorientierten ACL's der Fall ist (siehe Oben).