在 Symfony2 中,如何使用户帐户过期?

In Symfony2, how do I expire a user's account?

我想在有限的时间内为用户授予角色。例如,如果我有三个角色:

  1. ROLE_ADMIN
  2. ROLE_ACTIVE
  3. ROLE_USER

创建用户后,他将成为 ROLE_ACTIVE 帐户,他有 30 天的时间使用该帐户,然后他将成为 ROLE_USER.

我在用户实体中看到了credentials_expire_at,但是我该如何使用它呢?

您可以将 credentialsExpiresAt 设置为:

$user = new User(); // depends on your user class name
$user->setCredentialsExpireAt(new \DateTime()); // expires now for example

这只能解决您的部分问题,因为一旦日期超过 setCredentialsExpireAt 日期,用户将无法再登录,因为他们的登录已过期。

您可以通过多种方式解决这个问题,也许 运行 一个 cronjob 会查找具有 ROLE_ACTIVE 角色的过期用户并更改他们的 ROLE 并重新激活帐户。

或者这个其他选项可能更适合您的情况:

覆盖 User Model 中的以下方法:

//  FOSUserBundle/Model/User.php - override this in your child bundle.
public function isCredentialsNonExpired()
{
    if (true === $this->credentialsExpired) {
        return false;
    }
    if (null !== $this->credentialsExpireAt && $this->credentialsExpireAt->getTimestamp() < time()) {
        return false;
    }
    return true;
}

在此 if 块中:

if (null !== $this->credentialsExpireAt && $this->credentialsExpireAt->getTimestamp() < time()) {

return false 替换为更改用户角色的逻辑(如果他们有 ROLE_ACTIVE),删除到期并重新激活帐户。保存用户详细信息和 return true.

基本上这应该意味着当用户登录并且 FOSUserBundle 检查帐户是否已过期时,您将有机会覆盖过期并在用户被拒绝访问之前进行所需的更改,您将仍然需要在创建帐户时设置 credentialsExpireAt

编辑:

对于您的特定用例,我认为将 credentialsExpiresAt 字段全局设置为现在 + 30 天是个好主意。您可以在您的用户实体中执行此操作,当使用 FOSUserBundle 时,您需要扩展。

// Your file that extends FOSUserBundle/Model/User.php
public function __construct()
{
    parent::__construct();
    $this->setCredentialsExpireAt(
        new \DateTime(date('Y-m-d H:i:s', strtotime("+30 days")))
    );
}

使用此代码后,每个新用户的凭据将在 30 天内过期,在此期间您的代码将有机会捕获事件并覆盖您需要的任何内容。