Да, вы можете сделать это с помощью чего-то подобного:
use Symfony\Component\EventDispatcher\EventDispatcher,
Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken,
Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
public function registerAction()
{
// ...
if ($this->get("request")->getMethod() == "POST")
{
// ... Do any password setting here etc
$em->persist($user);
$em->flush();
// Here, "public" is the name of the firewall in your security.yml
$token = new UsernamePasswordToken($user, $user->getPassword(), "public", $user->getRoles());
// For older versions of Symfony, use security.context here
$this->get("security.token_storage")->setToken($token);
// Fire the login event
// Logging the user in above the way we do it doesn't do this automatically
$event = new InteractiveLoginEvent($request, $token);
$this->get("event_dispatcher")->dispatch("security.interactive_login", $event);
// maybe redirect out here
}
}
Событие в конце не выполняется автоматически, когда вы устанавливаете токен в контекст, тогда как обычно это происходит при использовании, например, формы входа в систему или аналогичной. Отсюда и причина его включения. Вам может потребоваться изменить тип используемого токена, в зависимости от вашего варианта использования - UsernamePasswordToken
, показанный выше, является основным токеном, но вы можете использовать другие при необходимости.
Редактировать : скорректировал приведенный выше код для объяснения параметра 'public', а также добавил роли пользователя в создание токена, основываясь на комментарии Франко ниже.