在 Symfony2 中,如何使用户帐户过期?
In Symfony2, how do I expire a user's account?
我想在有限的时间内为用户授予角色。例如,如果我有三个角色:
- ROLE_ADMIN
- ROLE_ACTIVE
- 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 天内过期,在此期间您的代码将有机会捕获事件并覆盖您需要的任何内容。
我想在有限的时间内为用户授予角色。例如,如果我有三个角色:
- ROLE_ADMIN
- ROLE_ACTIVE
- 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 天内过期,在此期间您的代码将有机会捕获事件并覆盖您需要的任何内容。