Symfony2创建自定义AccountStatusException

时间:2016-04-14 14:32:02

标签: php symfony

我想更改在使用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,因为我的用户实体包含一些额外的属性,例如bannedUntilbanReason,因此如果授权失败,则用户可以看到禁止到期日期和锁定原因。

我为此创建了新的例外:

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属性,如用户名,密码等,但不是bannedUntilbanReason,它们都是空的。

最终我看到的是

  

"你被禁止直到。原因:"。

以下是$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()对象时,它表明所有属性都已正确填充。

是否有可能通过这种方式达到所需的功能?任何帮助表示赞赏。

0 个答案:

没有答案