2016-10-11 6 views
1

ich eine Anwendung in Symfony 3 zu schaffen, die die folgende Struktur aufweist:demselben Benutzer, mehrere Konten mit unterschiedlichen Rollen

class Account { 
    private $id; 
    private $name; 
} 

class User { 
    private $id; 
    private $email; 
    private $password; 
} 

class UserAccount { 
    private $id; 
    private $userId; 
    private $roles; 
} 

Wie können wir ein Benutzer sehen auf mehrere Konten bei verschiedenen Rollen für jeden gehören können Konto, sagen wir, dass es für Konto 1 die Rolle ROLE_ADMIN und für Konto 2 die Rolle ROLE_EDITOR hat.

Das Problem ist, dass der Benutzer eine Auswahlbox haben muss, in der er das Konto ändern kann. Dies bedeutet, dass die Rolle aus der Datenbank geladen werden muss, basierend auf einem Wert für Sitzung (da die Konto-ID) festgelegt wird Session.

Dies bedeutet auch, dass wenn ein Benutzer sich an der Site anmeldet, es keine Rolle gibt, da die Rolle durch das ausgewählte Konto bestimmt wird.

Ich habe Probleme mit der Verwendung von Ereignissen, aber das scheint nicht von dem zu funktionieren, was ich gelesen habe.

Hat jemand irgendwelche Gedanken/Einblicke in diese?

Ich habe meine eigenen benutzerdefinierten Authentifikator, da ich sowohl MD5 und bcrypt Passwörter unterstützen muss.

Das bedeutet, dass ich eine Klasse habe, die SimpleFormAuthenticatorInterface von Symfony erweitert. Dadurch kann ich die Benutzer mit MD5 anmelden und sie automatisch auf bcrypt upgraden.

Meine User-Modell (das ist ein normaler) und benutzerdefinierte Authenticator: Gist

Um zu sumarize: Ich brauche eine Art und Weise, in der ich die Rollen des Benutzers ändern kann, nachdem er angemeldet hat, ohne das zu Zwingen Neuanmeldung des Benutzers

+0

Mann, Sie brauchen Vererbung so schlecht –

+0

auch brauchen wir mehr Informationen, um dies zu einer legitimen Frage machen, das ist sehr allgemein und wird nur meinungstechnische Antworten geben. –

+0

@ iam-decoder Welche Art von Informationen benötigen Sie? Fragen und ich werde zur Verfügung stellen, ich habe gelernt, über die Vererbung, das Konto ist eine Implementierung von Benutzer, aber das in meinem Kopf immer noch nicht funktioniert .. da die Rollen noch nach der Anmeldung geändert werden müssen. – Tio

Antwort

0

Also nach zwei Tagen des Kampfes, hier ist die Lösung. Wenn man sich die Frage anschaut, muss der Benutzer, wenn er sich anmeldet, eine Rolle nehmen, die durch die Benutzeraccount-Tabelle bestimmt wird, da ein Benutzer mehrere Konten haben kann Post Login Zuhörer:

/** 
    * On login 
    * 
    * @param InteractiveLoginEvent  $event The login event 
    * 
    * @return void 
    */ 
    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) { 
     $user = $this->tokenStorage->getToken()->getUser(); 
     // get the user accounts of the current from the database 
     $accountsOfUser = $this->em->getRepository('AppBundle\Entity\AccountHasUser')->getAccountsOfUser($user->getId()); 
     foreach ($accountsOfUser as $accountOfUser) { 
      $this->session->set('accountid', $accountOfUser['account_id']); 
       $user->resetAndAddRole('ROLE_' . $accountOfUser['const']); 
       break; 
     } 
     // We just need to set the new security token 
     $token = new UsernamePasswordToken(
      $user, 
      null, 
      'main', 
      $user->getRoles() 
    ); 
     // Update the current token to set the new role 
     $this->tokenStorage->setToken($token); 
} 

ich gewusst, dass ich nur einen Datensatz aus der Datenbank bekommen, aber das war nur für die Show (nicht blind copy/paste diese zu Ihrem Code).

Also im Grunde bekomme ich das erste Konto des Benutzers, bekommen Sie seine Rolle, setzen Sie die Konto-ID auf die Sitzung (noch ein bisschen mehr über Taschen auf Symfony-Sitzungen zu lesen), und generieren ein neues UsernamePasswordToken und Hinzufügen es zum TokenStorage.

Die $ user-> resetAndAddRole, ist eine Funktion in meinem User-Modell, dass nur die folgenden hat:

/** 
* Resets current user roles and add's the new one 
* 
* @param string  $role  The role to add 
* 
* @return AppBundle\Entity\User 
*/ 
public function resetAndAddRole($role) { 
    $this->roles = array($role); 
    return $this; 
} 

nun zwischen den Konten ändern Ich muss auch dem Benutzer erlauben, wenn angemeldet ist, so in einem Controller:

public function changeAccountAction(Request $request, $id) { 
     $user = $this->get('security.token_storage')->getToken()->getUser(); 
     $em = $this->getDoctrine()->getManager(); 
     $newAccountRole = $em->getRepository('AppBundle\Entity\AccountHasUser')->getAccountModelByAccountIdANdUserId($id, $user->getId()); 
     $user->resetAndAddRole('ROLE_' . $newAccountRole['const']); 
     $token = new UsernamePasswordToken(
      $user, 
      null, 
      'main', 
      $user->getRoles() 
     ); 
     // Update the current token to set the new role 
     $this->get('security.token_storage')->setToken($token); 
     $this->get('session')->set('accountid', $id); 
     // $em = $this->getDoctrine()->getManager(); 
     // $accountsList = $em->getRepository('AppBundle\Entity\AccountHasUser')->getAccountsOfUser($user->getId()); 
     // We need to change the users roles right here and how to we do it? 
     // We simply change the 

     return new RedirectResponse($this->generateUrl('dashboard')); 
    } 

Grundsätzlich erhalten das Konto, das durch Parameter übergeben wird, den Sitzungswert ändern, so können wir dies in unseren Fragen und jedem anderen Code verwenden, die Konto-ID erfordert, und erstellen Sie eine neue BenutzernamePasswordToken und voilá alles beginnt perfekt zu funktionieren.

Später werde ich den Code auf dem Controller zu einem Dienst verschieben, der auch an den Post-Login-Listener übergeben wird, so dass ich nur ein Spiel habe, um die Änderungen zu machen.

Ich weiß wirklich nicht, ob dies das richtige Weg ist, dies zu tun, aber für jetzt scheint es zu funktionieren.

Verwandte Themen