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.
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
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