我希望使用自定义字段登录以验证用户进入平台的身份。
重点是检查\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()
。
问题是:我可以随时登录。
答案 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()) {
,实际上这是许多人的首选方法,因为无论何时何地处理用户对象,都可以轻松地重用和访问它。