Php 在Symfony登录表单上添加约束

Php 在Symfony登录表单上添加约束,php,symfony,yaml,Php,Symfony,Yaml,我在我的Symfony应用程序中遇到了一个新问题,我找不到任何帮助 在我的数据库中,用户有一个激活\u令牌字段 当用户在我的网站上创建他的帐户时,它会生成一个随机令牌,用于验证他的帐户。它将向他发送一封带有令牌的电子邮件,以验证/激活他的帐户,当他点击它时,它会将激活\u令牌字段设置为空 创建帐户是可行的。发送电子邮件很有效。验证帐户有效。我只有一个问题 我想添加一个约束,当activation\u token字段不为空时,用户将无法登录。简言之,用户首先需要验证他的帐户才能登录。但我不知道如何

我在我的Symfony应用程序中遇到了一个新问题,我找不到任何帮助

在我的数据库中,用户有一个
激活\u令牌
字段

当用户在我的网站上创建他的帐户时,它会生成一个随机令牌,用于验证他的帐户。它将向他发送一封带有令牌的电子邮件,以验证/激活他的帐户,当他点击它时,它会将
激活\u令牌
字段设置为

创建帐户是可行的。发送电子邮件很有效。验证帐户有效。我只有一个问题

我想添加一个约束,当
activation\u token
字段不为空时,用户将无法登录。简言之,用户首先需要验证他的帐户才能登录。但我不知道如何添加这样的约束

目前,我可以登录,即使我没有验证我的帐户,这正是我想要防止的

我没有用PHP创建自定义登录表单,我使用的是Symfony的安全包。这里是我的
security.yaml
文件的一个示例


我不知道是否可以在安全捆绑包中添加约束。

对于Symfony 4.1之前的版本

您可以实现AdvancedUserInterface,它包含更多用于激活/停用用户、锁定用户、终止用户等的功能,而不是让您的用户实体实现基本用户界面

以下是文档页面的链接:

在您的情况下,您可能需要添加这种逻辑:

public function isEnabled()
{
    return null === $this->validationToken;
}

扩大Cerad对该问题的评论:

如果您使用的是Symfony>=4.4,则可以编写自定义的
UserChecker
。发件人:


可能需要一个电话。请确保在文档中选择您的Symfony版本。谢谢,事实上,自定义用户检查器是解决我的问题的解决方案AdvancedUserInterface。相反,正如Cerad在对问题的评论中指出的那样,定制用户检查器似乎是解决问题的方法。不过最终这取决于OP的版本。好的地方,谢谢你指出了不推荐的地方,自定义用户检查器是解决我问题的方法。我也在使用Symfony 5,所以我不能使用AdvancedUserInterface。我会记得详细说明我下次使用的版本。谢谢大家的帮助,就这么简单
<?php

namespace App\Security;

use App\Entity\User as AppUser;
use App\Exception\AccountDeletedException;
use Symfony\Component\Security\Core\Exception\AccountExpiredException;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAccountStatusException;
use Symfony\Component\Security\Core\User\UserCheckerInterface;
use Symfony\Component\Security\Core\User\UserInterface;

class UserChecker implements UserCheckerInterface
{
    public function checkPreAuth(UserInterface $user)
    {
        if (!$user instanceof AppUser) {
            return;
        }
        
        // this is your custom check:
        if (null !== $user->getActivationToken()) {
            throw new CustomUserMessageAccountStatusException('Please validate your account first, before logging in.');
        }
    }

    public function checkPostAuth(UserInterface $user)
    {
        // nothing to check here.
        return;
    }
}
# config/packages/security.yaml

# ...
security:
    firewalls:
        main:
            pattern: ^/
            user_checker: App\Security\UserChecker