Контекст: я создал пользовательский провайдер для моего приложения Silex, и теперь я могу зарегистрироваться и полностью зарегистрировать собственного пользователя. Тем не менее, мне нужно теперь автоматически регистрировать моего пользователя после регистрации, и это не работает.
Вот мой раздел безопасности:
'secured' => array( 'pattern' => '^/', 'anonymous' => false, 'form' => array('login_path' => '/login', 'check_path' => '/login_check'), 'logout' => array('logout_path' => '/logout', 'invalidate_session' => true), 'users' => $app->share(function () use ($app) { return new Partner\DAO\PartnerDAO($app['db']); }) )
Вот мой userProviderInterface:
public function refreshUser(UserInterface $user) { if (!$user instanceof Partner) { throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user))); } return $this->loadUserByUsername($user->getUsername()); } public function supportsClass($class) { return 'Partner\Entity\Partner' === $class; }
С Xdebug я вижу это здесь:
foreach ($this->userProviders as $provider) { try { $refreshedUser = $provider->refreshUser($user); $token->setUser($refreshedUser); if (null !== $this->logger) { $this->logger->debug('User was reloaded from a user provider.', array('username' => $refreshedUser->getUsername(), 'provider' => get_class($provider))); } return $token;
$this->userProviders
содержит только один провайдер: 'Users' => null
Обратите внимание, что :
Вход, регистрация и выход из системы работают отлично. Эта ошибка запускается только тогда, когда я хочу автоматически войти в систему с моего пользователя после регистрации. Вот код:
$token = new UsernamePasswordToken($partner, null, 'secured', $partner->getRoles()); // Note that $partner->getRoles() is array('ROLE_USER') $app['security.token_storage']->setToken($token); return $app->redirect($app["url_generator"]->generate("partner_home"));
После регистрации я автоматически создаю токен и перенаправляю пользователя в защищенной области, но Silex перенаправляет его на страницу входа в систему, и если я нажму где-нибудь, я получу:
Для пользователя «Partner \ Entity \ Partner» нет пользователя.
Я не знаю, где искать больше, и мне действительно может понадобиться помощь.
Основано решение, более похожее на обходное решение, но оно делает работу:
Вместо того, чтобы использовать метод security / token, я теперь регистрирую пользователя, создавая запрос к контроллеру login_check, чтобы генерировать все необходимое событие входа.
В моем контроллере:
$subRequest = Request::create( $app['url_generator']->generate('login_check'), 'POST', array( '_username' => $partner->getEmail(), '_password' => $rawPassword, $request->cookies->all(), array(), $request->server->all() ) ); $app->handle($subRequest, HttpKernelInterface::MASTER_REQUEST, false);
Для чего требуется «require_previous_session» => false »в конфигурации брандмауэра:
'secured' => array( 'pattern' => '^/', 'anonymous' => false, 'form' => array( 'login_path' => '/login', 'check_path' => '/login_check', 'require_previous_session' => false ), 'logout' => array('logout_path' => '/logout', 'invalidate_session' => true), 'users' => $app->share(function () use ($app) { return new Partner\DAO\PartnerDAO($app['db']); }) )
Я не уверен, что это хорошее или плохое решение, но оно работает.