¿Podría alguien explicar cómo puede crear manualmente una cookie de recordarme en un controlador?Crear un symfony2 recordarme cookie manualmente (FOSUserBundle)
Quiero que los usuarios sigan conectados después de presionar el botón "registrar" , sin tener que iniciar sesión con sus credenciales después.
He intentado crear una cookie manualmente, pero supongo que el valor de cookie es incorrecto, y por eso la funcionalidad "recordarme" no funciona. Se establece una cookie con el nombre correcto. Lo he comprobado.
La función Recordarme funciona de la manera esperada cuando se utiliza el procedimiento normal de inicio de sesión con las credenciales del usuario.
security.yml me
security:
firewalls:
main:
remember_me:
lifetime: 86400
domain: ~
path: /
key: myKey
security.yml recuerda que esto es lo que tengo ahora, a pesar de que la cookie se establece, no funciona.
$um = $this->get('fos_user.user_manager');
$member = $um->createUser();
… Form stuff with bindRequest etc.
$um->updatePassword($member);
$um->updateUser($member);
$providerKey = $this->container->getParameter('fos_user.firewall_name');
$securityKey = 'myKey';
$token = new RememberMeToken($member, $providerKey, $securityKey,
$member->getRoles());
$this->container->get('security.context')->setToken($token);
$redirectResponse = new RedirectResponse($url);
$redirectResponse->headers->setCookie(
new \Symfony\Component\HttpFoundation\Cookie(
'REMEMBERME',
base64_encode(implode(':', array($member->getUsername(),
$member->getPassword()))),
time() + 60*60*24
)
);
return $redirectResponse;
Actualización:
También he intentado trabajar con la clase PersistentTokenBasedRememberMeServices con la reflexión, pero no funciona. una galleta consigue el sistema pero que no está funcionando
$token = $this->container->get('security.context')->getToken();
$providerKey = $this->container->getParameter('fos_user.firewall_name');
$securityKey = 'myKey';
$persistenService = new
PersistentTokenBasedRememberMeServices(array($um), $providerKey,
$securityKey, array('path' => '/', 'name' => 'REMEMBERME', 'domain' =>
null, 'secure' => false, 'httponly' => true,
'lifetime' => 86400));
$persistenService->setTokenProvider(new InMemoryTokenProvider());
$method = new \ReflectionMethod('Symfony\Component\Security\Http\RememberMe\PersistentTokenBasedRememberMeServices',
'onLoginSuccess');
$method->setAccessible(true);
$method->invoke($persistenService, $request, $redirectResponse, $token);
estoy usando Symfony v2.0.5 y FOSUserBundle 1.0
ACTUALIZACIÓN 2:
He intentado una tercera manera. Lo mismo que el anterior pero sin reflexión:
$token = $this->container->get('security.context')->getToken();
$providerKey = $this->container->getParameter('fos_user.firewall_name');
$securityKey = 'myKey';
$persistenService = new PersistentTokenBasedRememberMeServices(array($um), $providerKey, $securityKey, array('path' => '/', 'name' => 'REMEMBERME', 'domain' => null, 'secure' => false, 'httponly' => true, 'lifetime' => 31536000, 'always_remember_me' => true, 'remember_me_parameter' => '_remember_me'));
$persistenService->setTokenProvider(new InMemoryTokenProvider());
$persistenService->loginSuccess($request, $redirectResponse, $token);
Para la obtención de parámetros de la cookie en security.yml y evitar duplicados, debe ponerlos en parameters.yml y en la seguridad .yml los llama con% your_parameter_name%. Ahora están disponibles en seguridad y en los parámetros – guillaumepotier
+1 Para usar las clases de seguridad de Symfony2 para esto. Tenga en cuenta que el nombre predeterminado de las cookies para recordarme es 'REMEMBERME'. Solo si utiliza el mismo nombre de cookie que el servidor de seguridad que está autenticando en contra de su conjunto manual, la cookie será reconocida por el agente de escucha de seguridad. – flu
Argumento 1 pasado a Symfony \ Bridge \ Doctrine \ Security \ User \ EntityUserProvider :: __ construct() debe implementar la interfaz Doctrine \ Common \ Persistence \ ManagerRegistry, instancia de Doctrine \ ORM \ EntityManager dado que obtuve D: –