php - 如何在 Silex 中向自定义用户提供商注册后自动登录新用户?

标签 php 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"));

注册后,我自动创建 token 并将用户重定向到安全区域,但 Silex 将其重定向到登录页面,如果我点击某个地方,我会得到:

There is no user provider for user "Partner\Entity\Partner".

我不知道去哪里搜索,我真的需要一些帮助。

最佳答案

找到了一个解决方案,更像是一个解决方法,但它完成了工作:

我现在不使用安全/ token 方法,而是通过生成对 login_check Controller 的请求来记录用户,以便生成所有必要的登录事件。

在我的 Controller 中:

$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']);
        })
    )

我不确定这是好是坏的解决方案,但它确实有效。

关于php - 如何在 Silex 中向自定义用户提供商注册后自动登录新用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32744298/

相关文章:

php - Laravel 验证邮件预览,渲染验证邮件

PHP:将月份添加到日期,但不超过该月的最后一天

php - eclipse 中的 json 解析器出错

symfony - Silex:带有可选参数的路由不起作用

php - 在 Silex 中安装多个 Controller

php - 功能测试和外部api

PHP - 如何为我的数组键分配一个名称而不是一个带有 array_push 的 int

PHP:如何防止序列化命中某个成员

PHP 表单 - 上传文件,想要使用 Silex 但不想使用 FormBuilder

Symfony RememberMe token_provider