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

如何在Symfony AdvancedUserInterface中使用凭据过期属性?,symfony,fosuserbundle,Symfony,Fosuserbundle,在Symfony 2.4项目中,我们的客户希望强制用户每N天更改一次密码。我们看到数据库中有“credentials\u expired”和“credentials\u expire\u at”列,以及一个在UserChecker类中抛出AccountExpiredException的检查,这似乎是出于此目的,但我找不到任何关于如何启用或配置此功能的文档 每次密码更改后,如何在“凭据过期”列中填入N天后的日期 如果密码过期,用户如何更改密码 如何提前几天警告用户密码过期 是否可以禁止重复使用最

在Symfony 2.4项目中,我们的客户希望强制用户每N天更改一次密码。我们看到数据库中有“credentials\u expired”和“credentials\u expire\u at”列,以及一个在UserChecker类中抛出AccountExpiredException的检查,这似乎是出于此目的,但我找不到任何关于如何启用或配置此功能的文档

  • 每次密码更改后,如何在“凭据过期”列中填入N天后的日期
  • 如果密码过期,用户如何更改密码
  • 如何提前几天警告用户密码过期
  • 是否可以禁止重复使用最后一个密码

事实上,这是您想要捕获的
凭证过期异常。如果您正在使用,那么最简单的处理方法是检查
安全控制器的
登录操作中的异常:

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'));
}
显然,您需要创建更改密码的路由,您可以将其设置为
changePassword
模板的表单操作。然后,可以在
SecurityController
中相应地处理密码更改请求

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

希望有帮助

注意:对于后代,过期用户对象存储在
credentialsfiredexception
异常中,因此,如果需要处理过期密码,您可以轻松检索该对象:


$error->getUser()

这个问题肯定太宽泛了,因为它包含4个子问题。你能把这些问题分成几个单独的问题吗?你可以从中得到很多启发。他们解决了几个问题。在symfony问题跟踪程序中重复了这个问题: