我想在一段时间内给用户一个ROLE。例如,如果我有三个角色:
创建用户后,他使用 ROLE_ACTIVE 帐户,他有30天的时间使用该帐户,然后他成为 ROLE_USER。
我在用户实体中看到credentials_expire_at
,但我该如何使用它?
答案 0 :(得分:1)
您可以将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天内过期,您的代码将有机会捕获事件并覆盖您需要的任何内容。