Qualcuno potrebbe spiegare come è possibile creare manualmente un cookie di ricordami in un controller?Creare symfony2 ricordami cookie manualmente (FOSUserBundle)
Desidero che gli utenti rimangano connessi dopo aver premuto il pulsante "registrati" , senza dover accedere successivamente con le credenziali.
Ho provato a creare un cookie manualmente ma credo che il valore del cookie non sia corretto, e quindi la funzionalità "remember me" non funziona. Viene impostato un cookie con il nome corretto. L'ho verificato
La funzione remember me funziona come previsto quando si utilizza la normale procedura di accesso con le credenziali dell'utente.
security.yml security.yml ricordati di me
security:
firewalls:
main:
remember_me:
lifetime: 86400
domain: ~
path: /
key: myKey
Questo è quello che ho adesso, anche se il cookie è impostato, non funziona.
$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;
Aggiornamento:
Ho anche provato a lavorare con la classe PersistentTokenBasedRememberMeServices con la riflessione, ma non funziona. un cookie viene impostato ma non funziona
$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);
sto utilizzando Symfony v2.0.5 e FOSUserBundle 1,0
UPDATE 2:
Ho provato un terzo modo. Lo stesso come sopra, ma senza riflessione:
$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);
Per ottenere i parametri dei cookie in security.yml ed evitare duplicati, li si dovrebbe mettere in parameters.yml e nella sicurezza .yml chiamali con% your_parameter_name%. Sono ora disponibili in sicurezza e nei parametri – guillaumepotier
+1 per l'utilizzo delle classi di sicurezza Symfony2 per questo. Tieni presente che il nome del cookie predefinito per i cookie remember-me è "REMEMBERME". Solo se si utilizza lo stesso nome di cookie del firewall che si sta autenticando con il proprio set di manuali, il cookie verrà riconosciuto dal listener di sicurezza. – flu
L'argomento 1 passato a Symfony \ Bridge \ Doctrine \ Security \ User \ EntityUserProvider :: __ construct() deve implementare l'interfaccia Doctrine \ Common \ Persistence \ ManagerRegistry, istanza di Doctrine \ ORM \ EntityManager dato che ho ottenuto D: –