如何在 Silex 中向自定义用户提供商注册后自动登录新用户?
How to automatically login a new user after registration with a custom user provider in Silex?
上下文:我为我的 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 在登录页面重定向它,如果我点击某处,我得到:
There is no user provider for user "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']);
})
)
我不确定这是好是坏的解决方案,但它确实有效。
上下文:我为我的 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 在登录页面重定向它,如果我点击某处,我得到:
There is no user provider for user "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']);
})
)
我不确定这是好是坏的解决方案,但它确实有效。