symfony 3.1注册电子邮件没有FOSUser

时间:2016-08-08 18:03:00

标签: symfony security registration

很高兴认识你。

我正在使用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。

我一直在搜索这个没有结果的问题,我确信这是非常常见的事情,每个人都想检查用户的电子邮件是否合适。

感谢。

1 个答案:

答案 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。