Estoy construyendo un sitio usando Symfony2 y será un tipo de sitio de marca blanca, donde varios dominios se asignan al mismo servidor. Así que coolsite.customer1.com y aservice.customer2.com se asignarían al mismo sitio, pero tendrían que aparecer diferentes para el usuario final. Ya resolví los dominios y cargué las configuraciones únicas como un servicio.Extender UserProvider para FOS UserBundle
Con el FOS UserBundle configurado y ejecutándose con un usuario personalizado (que tiene el ID de dominio almacenado), el registro, inicio de sesión, etc. funciona bien, excepto que los usuarios de domain1 también pueden iniciar sesión en domain2. Esto se espera en el FOS UserBundle. Necesito hacer modificaciones en el paquete para que solo autentique a los usuarios en el dominio al que están asignados.
He creado un userProvider que amplía el userProvider original en FOS y he reemplazado el método loadUserByUsername para también verificar el dominio. Vea debajo:
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);
}
}
He configurado el servicio con lo siguiente.
services:
me.security.authentication.userprovider:
class: Me\UserBundle\Security\UserProvider
arguments:
- @fos_user.user_manager
- @service_container
Mi security.yml se ve así:
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
¿Qué ocurre cuando intento acceder al sitio es una excepción. "ServiceNotFoundException: El servicio 'security.authentication.manager' tiene una dependencia en un servicio inexistente 'security.user.provider.concrete.fos_userbundle
basé mis modificaciones en This Cookbook Recipe
'." ¿Algunas ideas? Estoy completamente perplejo en esto.
Bueno, yo era capaz de conseguir el cambio de nombre del proveedor de funcionar, porque se me olvidó actualizar el proveedor en el/sección principal/form_login cortafuegos. Ahora el proceso de inicio de sesión funciona exactamente igual que si no hubiera realizado cambios, y no se ha llamado al proveedor que he especificado. Pude verificar que no se estaba llamando al descartar un eco y un comando de salida en el constructor. – Wpigott
Bueno, pude resolverlo. Sin embargo, no puedo responder a mi pregunta durante 8 horas, así que lo marcaré en ese momento y publicaré cómo lo resolví. – Wpigott