2012-09-20 16 views
7

Sto costruendo un sito utilizzando Symfony2 e sarà un tipo di sito in white label, in cui più domini si associano allo stesso server. Così coolsite.customer1.com e aservice.customer2.com si associano allo stesso sito, ma dovrebbero apparire diversi all'utente finale. Ho già risolto i domini e ho caricato le configurazioni univoche come un servizio.Estendi UserProvider per FOS UserBundle

Con il FOS UserBundle impostato e in esecuzione con un utente personalizzato (che ha il domain_id memorizzato in esso), la registrazione, il login, ecc funziona bene, tranne che gli utenti da domain1 possono accedere anche a domain2. Questo è previsto nel forum utente FOS. Devo apportare modifiche al pacchetto in modo tale che solo esso autentificherà gli utenti nel dominio a cui sono assegnati.

Ho creato un utenteProvider che estende l'utenteProvider originale in FOS e ha sovrascritto il metodo loadUserByUsername per controllare anche il dominio. Vedi sotto:

use FOS\UserBundle\Security\UserProvider as FOSProvider; 
use Symfony\Component\DependencyInjection\ContainerInterface; 
use FOS\UserBundle\Model\UserManagerInterface; 
use Me\CoreBundle\Models\Core; 

class UserProvider extends FOSProvider { 

    /** 
    * 
    * @var ContainerInterface 
    */ 
    protected $container; 


    public function __construct(UserManagerInterface $userManager, ContainerInterface $container) { 
     parent::__construct($userManager); 
     $this->container = $container; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    public function loadUserByUsername($username) 
    { 
     $core = $this->container->get('me_core'); 
     /* @var $core Core */ 

     $user = $this->findUserBy(array(
      'username'=>$username, 
      'domain_id'=>$core->getDomainMap()->getId(), 
     )); 

     if (!$user) { 
      throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username)); 
     } 

     return $user; 
    } 

    public function findUserBy(array $criteria) { 
     return $this->userManager->findUserBy($criteria); 
    } 

} 

Ho configurato il servizio con il seguente.

services: 
    me.security.authentication.userprovider: 
    class: Me\UserBundle\Security\UserProvider 
    arguments: 
     - @fos_user.user_manager 
     - @service_container 

mio security.yml si presenta così:

security: 
    providers: 
     me.security.authentication.userprovider: 
      id: fos_user.user_provider.username 

    encoders: 
     FOS\UserBundle\Model\UserInterface: sha512 

    firewalls: 
     main: 
      pattern: ^/ 
      form_login: 
       provider: fos_userbundle 
       csrf_provider: form.csrf_provider 
      logout:  true 
      anonymous: true 

    access_control: 
     - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/_wdt, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/public, role: IS_AUTHENTICATED_ANONYMOUSLY } 
     - { path: ^/admin/, role: ROLE_ADMIN } 
     - { path: ^/, role: ROLE_USER } 

    role_hierarchy: 
     ROLE_ADMIN:  ROLE_USER 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

Cosa succede quando si tenta di accedere al sito è un'eccezione. "ServiceNotFoundException: Il servizio 'security.authentication.manager' ha una dipendenza da un servizio inesistente 'security.user.provider.concrete.fos_userbundle

Ho basato la mia modifiche sulla This Cookbook Recipe

'." Qualche idea? Sono completamente perplesso su questo.

+1

Bene Sono stato in grado di ottenere il nome modificato del provider per funzionare, perché ho dimenticato di aggiornare il provider nella sezione firewall/main/form_login. Ora il processo di accesso funziona esattamente come se non avessi apportato alcuna modifica e il provider specificato non viene chiamato. Sono stato in grado di verificare che non venisse chiamato eliminando un eco e un comando di uscita nel costruttore. – Wpigott

+0

Beh, sono stato in grado di risolverlo. Non sono in grado di rispondere alla mia domanda per 8 ore, quindi la contrassegnerò risolta a quel punto e pubblicherò come l'ho risolta. – Wpigott

risposta

6

Sono riuscito a farlo funzionare. Ho scoperto che dovevo rendere "id" uguale al nome del servizio che stavo usando. Le righe commentate sono gli originali forniti con il pacchetto.

security: 
    providers: 
     me.security.authentication.userprovider: 
      id: me.security.authentication.userprovider 
     #fos_userbundle: 
      #id: fos_user.user_provider.username 
Problemi correlati