Symfony2-以编程方式设置记住我的cookie [英] Symfony2 - Programmatically set remember me cookie

查看:88
本文介绍了Symfony2-以编程方式设置记住我的cookie的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经通过新的simple_form函数实现了自定义身份验证器

I have implemented a custom authenticator through the new simple_form functionnality

    main:
        pattern: ^/
        simple_form:
            authenticator: custom_authenticator
            provider: fos_userbundle
            csrf_provider: form.csrf_provider
        remember_me:
            key:      "%secret%"
            lifetime: 31536000 # 365 jours
            path:     /
            domain:   ~
            name: my_remember_cookie

我的身份验证器中的authenticateToken()方法如下:

The authenticateToken() method from my Authenticator looks like:

try {
    $user = $userProvider->loadUserByUsername($token->getUsername());
} catch (UsernameNotFoundException $e) {
    throw new AuthenticationException('Unknown user');
}
if ($user->isLocked() === true) {
    throw new AuthenticationException('User locked');
}
if (/* Logic checks */) { 
    return new UsernamePasswordToken(
            $user, null, $providerKey, $user->getRoles()
    );
}

我想知道从这一点上是否存在一种以编程方式设置的方法记住我的cookie(在我的情况下,我想根据用户的角色设置它)?

I was wondering if, from this point, there is a method to programmatically set the remember me cookie (in my case i want to set it according to the user's role) ?

编辑:感谢sebbo,我解决了它 ,关键是要在$ request对象中将其手动设置为参数,然后再将其传递给RememberMe服务。

I solved it thanks to sebbo, the whole point is to manually set the remember_me parameter in the $request object before passing it to the rememberMe service.

我的最终代码:

/**
 * onAuthenticationSuccess
 * 
 * @param     Request $request
 * @param     TokenInterface $token
 * @return     Response
 */
public function onAuthenticationSuccess(Request $request, TokenInterface $token) {
    $url = $this->container->get("session")->get('_security.main.target_path') ? $this->container->get("session")->get('_security.main.target_path') : $this->container->get("router")->generate('home');
    $response = $request->isXmlHttpRequest() ?
            new JsonResponse(array(
                "success" => true,
                "url" => $url
            )) : new RedirectResponse($url);
    // Relevant part
    $rememberMeService = $this->container->get("EDE.security.service.remember_me");
    $request->attributes->set($rememberMeService->getRememberMeParameter(), 'true'/*set to other than 'yes'|'true'|'on'|'1' to force to don't set cookie*/);
    $rememberMeService->loginSuccess($request, $response, $token);
    return $response;
}

服务别名:

<service id="EDE.security.service.remember_me" alias="security.authentication.rememberme.services.simplehash.main"></service>

手动请求参数分配似乎有点脏,但可以。

The manual request parameter assignment seems a little bit dirty, but it works.

推荐答案

要以编程方式设置记住我 cookie,我们在应用程序中使用以下代码:

To set the remember me cookie programmatically we are using the following code in our application:

// setting the remember me token
$this->container->get('our_company.security.service.remember_me')->loginSuccess(
    $request,
    $response,
    $this->container->get('security.context')->getToken()
);

考虑 our_company.security.service.remember_me的服务定义只是Symfony2记住我服务的别名。我们必须创建此别名以使记住我服务公开。

Consider that the service definition for our_company.security.service.remember_me is only an alias for the Symfony2 remember me service. We had to create this alias to make the remember me service public.

这是服务定义:

<service id="our_company.security.service.remember_me" alias="security.authentication.rememberme.services.simplehash.main"/>

这篇关于Symfony2-以编程方式设置记住我的cookie的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆