我已经通过新的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
我的Authenticator中的authenticateToken()方法如下所示:
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(在我的情况下,我想根据用户的角色设置它)?
编辑:我解决了它感谢sebbo,重点是在将请求对象传递给rememberMe服务之前手动设置$ request对象中的remember_me参数.
我的最终代码:
/** * 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; }
服务别名:
手动请求参数分配似乎有点脏,但它的工作原理.
要以编程方式设置记住我的cookie,我们在应用程序中使用以下代码:
// 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记住我服务的别名.我们必须创建这个别名,以便让我记住我的服务.
这是服务定义:
<service id="our_company.security.service.remember_me" alias="security.authentication.rememberme.services.simplehash.main"/>