Я хочу автоматически войти в систему после регистрации. Сначала я пробовал этот путь https://gist.github.com/simonjodet/3927516 . Бут не работал. Я узнал, что у кого-то была такая же проблема, и нашел обходной путь в этом вопросе , но это не работает для меня.
Это мой код, процесс входа в систему работает правильно. Но не регистрируйтесь автоматически при регистрации.
Моя конфигурация безопасности:
$app['security.firewalls'] = array( 'main' => array( 'pattern' => '^(/user|/logout|/login_check)', 'form' => array( 'login_path' => '/login/', 'check_path' => '/login_check/', 'require_previous_session' => false, 'username_parameter'=> 'form[email]', 'password_parameter' => 'form[password]' ), 'remember_me' => array( 'key' => 'adfafasfasdfdasfasdfa', //whatever random string 'remember_me_parameter' => 'form[remember]' ), 'logout' => array('logout_path' => '/logout/', 'invalidate_session' => true), 'users' => function(Silex\Application $app){ return $app['user_manager']; } ) );
Мой код UserController.php при регистрации:
if ($signupForm->isValid()) { $plainPassword = $data['password']; //preparing data to be inserted $password = self::encodePassword($data['email'], $plainPassword, $app['security.encoder.digest']); //inserting the user $userManager->insertUser($data, $password, $app['slugger']); //generate a request to login_check $subRequest = \Symfony\Component\HttpFoundation\Request::create( '/login_check/', 'POST', array( 'form[email]' => $data['email'], 'form[password]' => $plainPassword, $app['request']->cookies->all(), array(), $app['request']->server->all() )); $app->handle($subRequest, \Symfony\Component\HttpKernel\HttpKernelInterface::MASTER_REQUEST, false);
Я использую электронную почту пользователя как то, что должно быть именем пользователя пользователя. Он не входит в систему, и это выход Monolog. Имя пользователя «NONE_PROVIDED», в то время как это должно быть электронное письмо пользователя.
[2016-03-16 19:29:41] myapp.INFO: Matched route "POST_login_". {"route_parameters":{"_controller":"user.controller:login","_route":"POST_login_"},"request_uri":"http://local.mysite.com/login/"} [] [2016-03-16 19:29:41] myapp.INFO: > POST /login/ [] [] [2016-03-16 19:29:41] myapp.INFO: Matched route "POST_login_check_". {"route_parameters":{"_controller":"loginCheck","_route":"POST_login_check_"},"request_uri":"http://localhost/login_check/"} [] [2016-03-16 19:29:41] myapp.INFO: Authentication request failed. {"exception":"[object] (Symfony\\Component\\Security\\Core\\Exception\\BadCredentialsException(code: 0): Bad credentials. at /home/myuser/www/local.mysite.com/vendor/symfony/security/Core/Authentication/Provider/UserAuthenticationProvider.php:73, Symfony\\Component\\Security\\Core\\Exception\\UsernameNotFoundException(code: 0): Username \"NONE_PROVIDED\" does not exist. at /home/myuser/www/local.mysite.com/app/Model/Manager/UserManager.php:58)"} [] [2016-03-16 19:29:41] myapp.DEBUG: Authentication failure, redirect triggered. {"failure_path":"/login/"} [] [2016-03-16 19:29:41] myapp.INFO: < 302 http://localhost/login/ [] [] [2016-03-16 19:29:41] myapp.INFO: < 200 [] []
РЕДАКТИРОВАТЬ:
Во время запроса я узнал, что, может быть, проблема в том, что когда я делаю автоматический запрос, я отправляю его из localhost вместо «local.mysite.com», как это исправить?
Я бы выбрал gist вместо перенаправления, это кажется мне взломанным.
Для нового компонента Symfony Security вам нужно немного адаптировать код. От SO этот ответ :
<?php // on your user registration controller... // create and store an authenticated token $token = new UsernamePasswordToken( $user, $user->getPassword(), 'main', //key of the firewall you are trying to authenticate $user->getRoles() ); $app['security.token_storage']->setToken($token); // _security_main is, again, the key of the firewall $app['session']->set('_security_main', serialize($token)); $app['session']->save(); // this will be done automatically but it does not hurt to do it explicitly return $app->redirect('/where-ever-you-want');
Я не тестировал этот код!
ОБНОВЛЕНИЕ Для справки, документация Symfony имеет хороший пример: как имитировать аутентификацию с помощью токена в функциональном тесте