我正在使用Symfony 3.1.3进行开发,我正在使用框架提供的安全系统,没有FOSUser,也没有Guard。
我的控制器中有典型的登录功能:
public function loginAction(Request $request)
{
// This works
$authenticationUtils = $this->get('security.authentication_utils');
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render(
'security/loginForm_old.html.twig',
array(
// last username entered by the user
'last_username' => $lastUsername,
'error' => $error,
)
);
}
我想检查用户是否已激活他的帐户。在实体用户中,我默认将isActive属性设置为false,并且仅将注册电子邮件中的链接设置为true。
我一直在搜索这个没有结果的问题,我确信这是非常常见的事情,每个人都想检查用户的电子邮件是否合适。
感谢。
答案 0 :(得分:3)
让我们假设您有一个RegistrationController.php类,您可以在其中存储管理用户注册的所有代码。
创建一个在注册后向用户发送电子邮件的功能:
public function sendConfirmationEmailMessage(User $user)
{
$confirmationToken = $user->getConfirmationToken();
$username = $user->getUsername();
$subject = 'Account activation';
$email = $user->getEmail();
$renderedTemplate = $this->templating->render('AppBundle:Emails:registration.html.twig', array(
'username' => $username,
'confirmationToken' => $confirmationToken
));
$message = \Swift_Message::newInstance()
->setSubject($subject)
->setFrom(MAILER_FROM)
->setReplyTo(MAILER_FROM)
->setTo($email)
->setBody($renderedTemplate, "text/html");
$this->mailer->send($message);
}
创建与函数关联的路由,该路由将生成的令牌作为参数,然后通过该令牌搜索用户并激活用户是否存在:
/**
* @Route("user/activate/{token}")
*/
public function confirmAction(Request $request, $token)
{
$em = $this->getDoctrine()->getManager();
$repository = $em->getRepository('AppBundle:User');
$user = $repository->findUserByConfirmationToken($token);
if (!$user)
{
throw $this->createNotFoundException('We couldn\'t find an account for that confirmation token');
}
$user->setConfirmationToken(null);
$user->setEnabled(true);
$em->persist($user);
$em->flush();
return $this->redirectToRoute('user_registration_confirmed');
}
然后当你有一个实际注册用户的函数时,你调用sendConfirmationEmailMessage,如下所示:
public function registerAction(Request $request)
{
/* All the logic goes here: form validation, creating new user */
/* $user is created user */
sendConfirmationEmailMessage($user);
}
无论如何isActive()函数返回false Symfony安全系统将阻止您登录。您的用户实体应该实现UserInterface。