我想更改在使用UserChecker
类进行身份验证之前检查用户的默认Symfony逻辑。
它有一个方法checkPreAuth
,在用户通过身份验证之前会进行一些检查:
public function checkPreAuth(UserInterface $user)
{
if (!$user instanceof AdvancedUserInterface) {
return;
}
if (!$user->isAccountNonLocked()) {
$ex = new LockedException('User account is locked.');
$ex->setUser($user);
throw $ex;
}
if (!$user->isEnabled()) {
$ex = new DisabledException('User account is disabled.');
$ex->setUser($user);
throw $ex;
}
if (!$user->isAccountNonExpired()) {
$ex = new AccountExpiredException('User account has expired.');
$ex->setUser($user);
throw $ex;
}
}
我想将默认LockedException
替换为我自己的BannedException
,因为我的用户实体包含一些额外的属性,例如bannedUntil
和banReason
,因此如果授权失败,则用户可以看到禁止到期日期和锁定原因。
我为此创建了新的例外:
namespace Eugenics\SiteBundle\Exception;
use Symfony\Component\Security\Core\Exception\AccountStatusException;
/**
* Class BannedException.
*/
class BannedException extends AccountStatusException
{
/**
* {@inheritdoc}
*/
public function getMessageKey()
{
$user = $this->getUser();
$bannedUntil = $user->getBannedUntil()->format('Y-m-d H:i:s');
$banReason = $user->getBanReason();
return 'You are banned until ' . $bannedUntil . '. Reason: ' . $banReason;
}
}
问题在于,继承的方法getUser()
无法获取用户实体的完整副本,它只是填充了标准AdvancedUserInterface
属性,如用户名,密码等,但不是bannedUntil
和banReason
,它们都是空的。
最终我看到的是
"你被禁止直到。原因:"。
以下是$user
方法内部getMessageKey
变量的转储:
object(stdClass)#634 (28) { ["__CLASS__"]=> string(30) "Eugenics\SiteBundle\Entity\User" ["comments"]=> NULL ["id"]=> int(5) ["username"]=> string(8) "eugenics" ["email"]=> string(21) "email@example.com" ["salt"]=> string(31) "9lcjfix8eyw4scg0gkk000k4socgcoo" ["password"]=> string(60) "$2y$12$9lcjfix8eyw4scg0gkk00u79ox.0Uc.XtusBoeDFTgRUvKMi9J/FO" ["plainPassword"]=> NULL ["registeredAt"]=> NULL ["lastLoginAt"]=> NULL ["confirmationToken"]=> NULL ["passwordRequestedAt"]=> NULL ["banned"]=> bool(true) ["bannedUntil"]=> NULL ["bannedBy"]=> NULL ["banReason"]=> NULL ["firstName"]=> NULL ["lastName"]=> NULL ["birthdate"]=> NULL ["gender"]=> NULL ["photoUrl"]=> NULL ["photoPreviewUrl"]=> NULL ["confirmed"]=> NULL ["status"]=> NULL ["rating"]=> NULL ["private"]=> NULL ["lastActivityAt"]=> NULL }
但是当我直接从$user
转储checkPreAuth()
对象时,它表明所有属性都已正确填充。
是否有可能通过这种方式达到所需的功能?任何帮助表示赞赏。