2012-04-05 11 views
2

Ich habe einen Benutzer und eine Gruppe Entität, die beide eine Reihe von Rollen halten.Wo Sicherheitsrollen definieren?

Jetzt möchte ich die Option offen halten, um die Rollen zu ändern, sie hinzuzufügen und so weiter.

Soll ich Konstanten in den Klassen dafür verwenden oder sollte ich eine OneToOne-Beziehung auf eine Tabelle beziehen, die alle Rollen hält?

Mit besten Grüßen, pus.dev

Benutzer < => Rollen Gruppe < => Rollen

public function getRoles() 
{ 
    $roles = $this->roles; 

    foreach ($this->getGroups() as $group) { 
     $roles = array_merge($roles, $group->getRoles()); 
    } 

    // we need to make sure to have at least one role 
    $roles[] = static::ROLE_DEFAULT; 

    return array_unique($roles); 
} 
+0

Warum nicht verwenden FOSUserBundle dafür? Es bietet alles, was Sie brauchen. – Flukey

+0

Hallo, ich habe von FOSUserBundle zu einem eigenen Bundle gewechselt :) Wie erstelle ich neue Rollen in Symfony? –

Antwort

2

Wie über eine Tabelle Rollen mit ManyToOne Bezug auf jeden Benutzer zu erstellen. Eine Zeile der Tabelle Rollen enthält eine Rolle (Zeichenfolge oder Konstante int) und einen Benutzer.

Alternativ können Sie eine Rolle-Tabelle erstellen und eine ManyToMany-Beziehung mit der Benutzertabelle haben. Mit dieser Funktion können Sie Rollen dynamisch definieren, sodass Sie die möglichen Rollen nicht fest codieren müssen.

Im OneToMany Fall könnten Sie die Rollen abrufen, indem Sie eine solche Funktion zu schreiben:

/** @OneToMany(...) */ 
/** $roles contains strings */ 
protected $roles; 

public function getRoles() { 
    return $this->roles; 
} 

ODER

/** @OneToMany(...) */ 
/** $roles contains integers */ 
protected $roles; 

public function getRoles() { 
    $rolesArr = array(1 => 'ROLE_ADMIN', 2 => 'ROLE_USER', 3 => 'ROLE_EDITOR'); // you should refactor $rolesArr 
    $retRoles = array(); 
    foreach($this->roles as $role) { 
     $retRoles[] = $rolesArr[$role]; 
    } 
    return $retRoles; 
} 

Im ManyToMany Fall, dass Sie durch das Schreiben eine solche Funktion, die Rollen abrufen können:

/** @ManyToMany(...) */ 
protected $roles; 
// ... 
public function getRoles() { 
    $retRoles = array(); 
    // symfony2 requires a string array 
    foreach($this->roles as $role) { 
     $retRoles[] = $role->getName(); // or $retRoles[] = 'ROLE_' . $role->getName(); 
    } 
    return $retRoles; 
} 

Und vergessen Sie nicht, dass Ihr Benutzermodell Symfony's Built-i implementieren muss n Benutzeroberfläche.

Für Gruppen Rollen, die Sie dies tun können:

class Group 
{ 
    /** @ManyToMany(...) */ 
    protected $roles; 

    public function getRoles() { 
     return $this->roles; 
    } 
} 

class User 
{ 
    /** @ORM\Column(...) */ 
    protected $group; 

    /** @ManyToMany(...) */ 
    protected $roles; 
    // ... 

    public function getRoles() { 
     $retRoles = array(); 
     // symfony2 requires a string array 
     $roles = $this->roles->merge($this->group->getRoles()); 
     foreach($roles as $role) { 
      $retRoles[] = $role->getName(); // or $retRoles[] = 'ROLE_' . $role->getName(); 
     } 
     return $retRoles; 
    } 
} 
+0

Hallo, danke für die ausführliche Beschreibung. Ich würde den ManyToMany-Weg nehmen. Können Sie mir empfehlen, was Sie für Eigenschaften in einer Rollenentität verwenden würden? Welche Eigenschaften müssen mit ACLs kompatibel sein? Auch wie garantiere ich eine ManyToMany mit Benutzer und Gruppe? –

+0

Eine Gruppe enthält viele Benutzer, jeder Benutzer hat viele Rollen, jede Rolle hat viele Benutzer, imho-Gruppen haben nichts mit Benutzerrollen zu tun. –

+0

Aber die Gruppe konnte spezielle Daten halten. Zum Beispiel gibt es eine zusätzliche Admin-Gruppe und alle Mitglieder haben zusätzlich die ROLE_ADMIN. Wäre das nicht ein gutes Beispiel, wenn Gruppen, die Rollen halten, gut wären? –

Verwandte Themen