2017-10-23 15 views
0

Ich erkunde die Möglichkeiten von FOS Bundle User.FOS Bundle User - mehrere Rollen

Dank Knpuniversity (https://knpuniversity.com/screencast/fosuserbundle/roles-canonical-fields) entdeckte ich dieses gute Bündel, um Benutzer zu verwalten.

In meinem Fall brauche ich auch mehrere Rollen BUUUUUUT Ich möchte es nicht mit einem Array von Rollen in einem Feld aus der Benutzertabelle speichern. Ich beabsichtige, mehr Tabellen mit einer Beziehung 'n' zu 'm' zu verwenden, wobei 1 Benutzer 'n' Rollen hat und 1 Rolle auch von 'n' Benutzern verwendet werden kann.

Anstatt eine Tabelle zu haben, um Benutzer und Rollen zu verwalten, brauche ich eine Tabelle für Benutzer, eine Tabelle für Rollen und eine letzte, um die Beziehung n-m zwischen ihnen zu machen. Ich brauche das, weil ich diese Struktur für andere Funktionalitäten verwenden und die Rollen als ein Array speichern werde ... wird mehr Probleme schaffen als lösen ... in meinem Fall.

Was schlagen Sie vor, um das zu erreichen? Vielleicht ein anderes Bündel? Vielleicht eine einfache Lösung, um das Bundle an meine Anforderungen anzupassen?

Was denkst du könnte ich tun?

Vielen Dank im Voraus.

Antwort

0

Schließlich habe ich die Funktionalität von FOSUserBunlde mit Rollen und Gruppen verwendet, wobei jede Rolle als Berechtigungen zum Ausführen des Controllers und die Gruppen zur einfachen Verwaltung aller Rollen eines Benutzers verwendet werden.

0

Ich würde eine neue UserManager-Klasse erstellen, die die FosUserManager-Klasse erweitert und die rollenbezogenen Methoden überschreibt. Aber nicht sicher ob es würdig ist oder nicht. Außerdem müssen Sie ein mittleres einfaches Objekt erstellen, das sich vom FosUserBundle-Benutzermodell erstreckt, und es dann zum Erstellen Ihrer Benutzer-Entität verwenden. In diesem mittleren Objekt müssen Sie die Art ändern, in der Rollen gespeichert werden.

Im Ernst, ich bin mir nicht sicher, das ist besser, als Ihre eigene Benutzerverwaltung von Grund auf neu zu starten.

+0

Wenn es notwendig ist, werde ich es auf meinem Weg tun, wie Sie gesagt haben. Der Punkt war zu versuchen, zu vermeiden, an dieser Funktionalität zu arbeiten und die Vorteile der Verwendung eines gemeinsamen Pakets für zukünftige Updates in symfony, etc. zu nehmen. Bitte, wenn jemand mehr Ideen hat ... Ich würde gerne mehr Optionen hören, bevor Sie sich entscheiden endlich die authentifizierenden Benutzer selbst zu tun, Rollenfunktionen zu verwalten. etc. –

0

Das ist, was ich tue und arbeitet für mich ziemlich gut:

Ich habe einen Benutzer, Rolle und ein Einheiten-Gruppe

Benutzer Entity

use FOS\UserBundle\Model\User as BaseUser; 
use Doctrine\ORM\Mapping as ORM; 

     /** 
     * @ORM\Entity 
     * @ORM\Table(name="fos_user") 
     */ 
     class User extends BaseUser 
     { 
      /** 
      * @ORM\Id 
      * @ORM\Column(type="integer") 
      * @ORM\GeneratedValue(strategy="AUTO") 
      */ 
      protected $id; 

      public function __construct() 
      { 
       parent::__construct(); 
       // your own logic 
      } 
     } 

Gruppeneinheit

use FOS\UserBundle\Model\Group as BaseGroup; 
use Doctrine\ORM\Mapping as ORM; 

     /** 
     * @ORM\Entity 
     * @ORM\Table(name="fos_group") 
     */ 
     class Group extends BaseGroup 
     { 
      /** 
      * @ORM\Id 
      * @ORM\Column(type="integer") 
      * @ORM\GeneratedValue(strategy="AUTO") 
      */ 
      protected $id; 
     } 

all dies ist von FOS docs

Jetzt sind die Rollen standardmäßig als Array kommt aber symfony ein Symfony \ Component \ Security \ Core \ Rolle \ Rollenklasse von ihm zu verlängern.

so sollten Sie Ihre Rolle Klasse wie folgt aussehen:

Rolle Entity

use Symfony\Component\Security\Core\Role\Role as BaseRol; 
use Doctrine\ORM\Mapping as ORM; 

     /** 
     * @ORM\Entity 
     * @ORM\Table(name="fos_role") 
     */ 
     class Role extends BaseRol 
     { 
      /** 
      * @ORM\Id 
      * @ORM\Column(type="integer") 
      * @ORM\GeneratedValue(strategy="AUTO") 
      */ 
      protected $id; 

      public function __construct() 
      { 
       parent::__construct(); 
       // your own logic 
      } 
     } 

die Magie zu tun brauchen Sie nur die Abbildungsinformationen wie folgt hinzuzufügen.

Um Gruppen in Benutzer Entitäten

/** 
      * @ORM\ManyToMany(targetEntity="path/to/my/groupEntity") 
      * @ORM\JoinTable(name="join_table_name", 
      *  joinColumns={@ORM\JoinColumn(name="join_column_name_id", referencedColumnName="id")}, 
      *  inverseJoinColumns={@ORM\JoinColumn(name="join_column_name_id", referencedColumnName="id")} 
      *) 
      */ 
      protected $groups; 

Zur Unterstützung Rollen in beiden Gruppen und Benutzer Einheit

/** 
       * @ORM\ManyToMany(targetEntity="path/to/my/roleEntity") 
       * @ORM\JoinTable(name="join_table_name", 
       *  joinColumns={@ORM\JoinColumn(name="join_column_name_id", referencedColumnName="id")}, 
       *  inverseJoinColumns={@ORM\JoinColumn(name="join_column_name_id", referencedColumnName="id")} 
       *) 
       */ 
       protected $roles; 

Nach dieser Aktualisierung Ihrer Datenbank und Sie sind Unterstützung bereit gehen.

Verwandte Themen