[cakephp] 3 Tabellen mit einer Relationstabelle verbinden

Darian

Erfahrenes Mitglied
Hallo Leute,

habe gerade folgendes Problem:
Ich will mit cakephp ein System programmieren um Mailboxen+Weiterleitungen für verschiedene Domains zu verwalten. Jetzt will ich User erstellen, die für verschiedene Domains wieder verschiedene Rechte haben.

4 Tabellen:
- users
- domains
- privileges (mögliche rechte wie, er darf alias erstellen, er darf Mailboxen erstellen/verwalten)

Relation-Table:
users_privileges_domains: id, users_id, privileges_id, domains_id

Jetzt verknüpfe ich ja mit einer Tabelle 3 andere.
zum Beispiel.: Der User "Test" hat das Recht Mailboxen zu erstellen bei der Domain example.com

Denkt ihr das könnte so gehen, oder müsste ich statt einer Relation-Table zwei nehmen?

Das Model für die Domains würde dann wie folgt aussehen:

PHP:
class Domain extends AppModel
    {
        var $useTable = "virtual_domains";

        var $hasAndBelongsToMany = array(
        		"User" => array(
        			"className" => "User",
        			"joinTable" => "users_privileges_domains",
        			"foreignKey" => "domain_id",
        			"associationForeignKey" => "user_id"
        	),
        		"Privilege" => array(
        			"className" => "Privilege",
        			"joinTable" => "users_privileges_domains",
        			"foreignKey" => "domain_id",
        			"associationForeignKey" => "privilege_id"
        	)
        );

        var $hasMany = array("Alias", "VirtualUser");
        
    }

Für User und Privileges wäre das ungefähr das selbe, nur mit jeweils den anderen Tabellen verknüpft.

Also, wie würdet ihr das machen, oder würdet ihr allgemein anders an das Problem ran gehen?

ciao und lg
Darian
 
Hallo,

dein Thema gehört eigentlich in Relationale Datenbanken. Um der 3. Normalform gerecht zu werden, brauchst du tatsächlich 2 Relationstabellen. Vorallem, wenn du die Rechte nicht als MASK abspeichern willst.
 
Ok, danke dir. Ich werde das dann also ändern, und versuchen brauchbare Models zu bauen.

Dann würde ich also die Relationstabelle users_privileges mit domains verknüpfen, und eine users_privileges_domains erhalten? Meinst du das so?

Ok, die Normalisierung muss ich mich jetzt tatsächlich mal genauer einlesen, habe das immer nur so überflogen.

Was meinst du mit MASK? Habe da jetzt nichts gefunden diesbezüglich.

thx und lg
Darian
 
Was eine Mask ist und wie sie funktioniert:

Wenn man nur ein Feld (z.B. ein Integer) hat, man darin aber mehrere Zustände (bspw. Rechte) ablegen möchte, benötigt man eine Mask. Ich weiß nicht ob du Linux kennst. Aber die Attribute einer Datei werden z.B. so maskiert:

Read = 4
Write = 2
Execute = 1

Wenn man eine Datei bspw. lesen und schreiben möchte, benötigt man als Recht 4+2 = 6. Wenn man Lesen-Schreiben-Ausführen will, benötigt man also 4+2+1 = 7. Wenn man Lesen und Auführen will, braucht man also 4+1 = 5.

Umgekehrt ist das natürlich auch möglich. Jede Zahl eine Bit-Representation und Bit-Operationen können einem an dieser Stelle das Leben vereinfachen:

PHP:
<?php
define('READ', 4);
define('WRITE', 2);
define('EXECUTE', 1);


// Hier $attr füttern in dem man die Attribute einer Datei ausliest

$attr = 5;

if ($attr & READ)
{
  echo "Leserechte<br/>";
}

if ($attr & WRITE)
{
  echo "Schreibrechte";
}

if ($attr & EXECUTE)
{
  echo "Ausführrechte";
}
?>

Bei einer Mask muss man immer darauf aufpassen als Mask-Values nur Werte von 2^n zu akzeptieren. Sonst funktionieren die Bit-Operationen natürlich nicht mehr. Also immer nur 1,2,4,8,16,32,64.... usw.
 
Hallo Leute,

hatte bis jetzt leider fast keine Zeit mehr um weiter zu machen. Aber heute habe ich mir das noch einmal überlegt.

Ich habe die DB nach deiner Idee angepasst, und mal ein Screenshot gebastelt. (datebase.jpg)

Jetzt frage ich mir nur folgendes, da privileges_user ja eine Relationstabelle ist, und ich da normalerweise kein Model machen würde, Kann ich ja auch wieder domains und privileges_users verbinden.

Muss ich daher doch ein Model dafür schreiben um es zu verknüpfen, oder bietet da cakephp andere Möglichkeiten?

Würde mich über ein paar Infos freuen, bin mir da jetzt noch nicht so ganz sicher in welche Richtung ich gehen soll.

thx und lg
Darian
 

Anhänge

  • database.jpg
    database.jpg
    48 KB · Aufrufe: 115
Zurück