如何在Symfony AdvancedUserInterface中使用凭证过期属性?

Tho*_*och 6 symfony fosuserbundle

在Symfony 2.4项目中,我们的客户希望强制用户每N天更改一次密码.我们看到数据库中有"credentials_expired"和"credentials_expire_at"列,并且在UserChecker类中抛出了一个似乎用于此目的的AccountExpiredException,但我找不到任何关于如何启用或配置此文档的文档特征.

  • 在每次密码更改后的N天后,credentials_expire_at列如何填充日期?
  • 如果密码过期,用户如何更改密码?
  • 如何提前几天警告用户关于passoword到期?
  • 是否可以禁止重复使用上一个密码?

Hai*_*ian 2

其实,这就是CredentialsExpiredException你想要抓住的。如果您使用Symfony Security 组件,那么处理此问题的最简单方法是检查loginAction您的以下内容中的异常SecurityController

use Symfony\Component\Security\Core\Exception\CredentialsExpiredException;
use Symfony\Component\Security\Core\SecurityContextInterface;

...

$error = $this->get('session')->get(SecurityContextInterface::AUTHENTICATION_ERROR);

// check if credentials have expired
if ($error instanceof CredentialsExpiredException) {
    // display the change password form
    return new Response($this->renderView('AcmeDemoBundle:Security:changePassword.html.twig'));
}
Run Code Online (Sandbox Code Playgroud)

显然,您需要创建一个更改密码的路径,您可以将其设置为模板的表单操作changePassword。然后可以在您的SecurityController.

您的业​​务逻辑的核心可以/应该存在于UserManager(或任何您希望称之为的)服务类中,您可以根据需要从您的SecurityController.

希望有帮助。

注意:对于后代,过期的用户对象存储在CredentialsExpiredException异常中,因此如果您需要对其进行操作来处理过期的密码,您可以轻松检索它:

$error->getUser();