Silex + RememberMeServiceProvider - 从代码登录

Silex + RememberMeServiceProvider - login from code

我正在尝试创建一个 ajax 登录表单。 我已经根据 http://silex.sensiolabs.org/doc/providers/remember_me.html 配置了 RememberMeServiceProvider 它与默认登录表单配合使用效果很好 - 进入 'login_path' 并由 Silex 管理的表单。

我现在正在尝试制作自定义登录控制器(仅限 AJAX)。 它看起来像这样:

public function ajaxLogin(Request $request, Application $app) {
    if (!AJAX)
        die;
    $email = $request->request->get('_username');
    $pass = $request->request->get('_password');
    if (!$email || !$pass)
        return 0;
    try {
        $user = APP::repo('users')->findOneByEmail($email);
        if (!$user)
            return 0;
        $encodedPass = $app['security.encoder_factory']->getEncoder($user)->encodePassword($pass, $user->getSalt());
        if ($encodedPass !== $user->getPassword())
            return 0;
        $token = new UsernamePasswordToken($user, $pass, 'all', $user->getRoles());
        $app['security']->setToken($token);
        return 1;
    } catch (Exception $e) {
        return 0;
    }
}

效果很好,但我的“记住我”选项有问题。我怎样才能让它与上面的自定义登录控制器一起工作?

问题是你绕过了安全监听器,自己创建了认证令牌。

要创建记住我的 cookie,您必须触发 RememberMeServicesloginSuccess 方法。

$app['security.remember_me.service.my-firewall']->loginSuccess($request, $response, $token);

否则,您应该实现自己的 PreAuthenticator : http://symfony.com/doc/current/cookbook/security/api_key_authentication.html