我想给用户一个时间有限的角色。例如,如果我有三个角色:
创建用户后,他将成为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并重新激活帐户。
或者,此其他选项可能更适合您的情况:
覆盖用户模型中的以下方法:
// 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天内过期,在此期间,您的代码将有机会捕获事件并覆盖您所需的任何内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句