使用自定义身份验证登录

时间:2020-06-12 09:20:28

标签: symfony

我希望使用自定义字段登录以验证用户进入平台的身份。 重点是检查\DateTime('now')的字段'pw_expires_at',以记录用户。

这是我到目前为止所做的:

在控制器中:

$user->setPassword(
    $passwordEncoder->encodePassword(
    $user,    
    $mdp)
);

$user->setPwExpiresAt(new \DateTime("now + 1 minute"));

$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();

在身份验证器中:

public function checkCredentials($credentials, UserInterface $user)
{
    $valid = false;
    $validDate = $this->checkDate($credentials, $user);
    $validPassword = $this->passwordEncoder->isPasswordValid($user, $credentials['password']);

    if($validDate && $validPassword) {
        $valid = true;
    }

    return $valid;

}

/**
 * @return bool
 */
public function checkDate($credentials, UserInterface $user){

    $now = new \DateTime('now');
    $pwdate = new \DateTime();

    $pwdate = $this->entityManager->getRepository(Users::class)->findOneBy([
        'email' => $credentials['email']
    ]);

    if ($pwdate > $now) {
        return false;
    }
    else {
        return true;
    }
}

我还在AuthenticatorInterface.php中添加了新功能checkDate()

问题是:我可以随时登录。

1 个答案:

答案 0 :(得分:1)

您正在比较(>一个用户对象repository->findBy(...),该对象返回一个Users::class和一个DateTime对象$now = new \DateTime();

$user对象的entityManager响应也很可能是您的getUsername函数(在此函数中作为参数传递的对象)返回的同一对象,因此可以跳过吗?如果它是不包含此过期值的DTO,则将其重新添加。
同样,您也不再将凭据用于任何用途,因此也将其删除。

我将其更改为:

public function checkDate(UserInterface $user) {
    $now = new \DateTime();

    $pwdate = $user->getPwExpiresAt();

    // we dont need the if/else as this ($pwdate > $now)
    // is an expression and will already return true/false;
    return $pwdate > $now; 
}

更多建议:

  • 您可能想重新考虑将函数重命名为更具表现力的名称,例如$this->hasAuthenticationExpired($user),这应该清楚地表明该函数在做什么,而不是“检查日期(针对什么?!)”,而无需阅读该功能。

  • 您可以将此函数移至用户对象,例如 public function hasExpired() { return $this->getPwExpiresAt() && new \DateTime() > $this->getPwExpiresAt(); } 只需调用if (!$user->hasExpired()) {,实际上这是许多人的首选方法,因为无论何时何地处理用户对象,都可以轻松地重用和访问它。