我需要一个解决方案,允许经过身份验证的用户访问某些控制器/操作,而不是基于他们的用户类型:即。管理员或普通用户(虽然我稍后可能会使用标准 ACL 添加它)但根据他们用户的当前状态。
例如 :
他们加入网站的时间是否超过 1 周?
他们是否完整填写了个人资料?
实际上,现在我想起来了,有点像他们在这个网站上拥有的特权和徽章。
我需要一个解决方案,允许经过身份验证的用户访问某些控制器/操作,而不是基于他们的用户类型:即。管理员或普通用户(虽然我稍后可能会使用标准 ACL 添加它)但根据他们用户的当前状态。
例如 :
他们加入网站的时间是否超过 1 周?
他们是否完整填写了个人资料?
实际上,现在我想起来了,有点像他们在这个网站上拥有的特权和徽章。
对于您所描述的基于动态条件的测试,您可以在规则中使用动态断言。Zend_Acl
例如:
class My_Acl_IsProfileComplete implements Zend_Acl_Assert_Interface
{
protected $user;
public function __construct($user)
{
$this->user = $user;
}
public function assert(Zend_Acl $acl,
Zend_Acl_Role_Interface $role = null,
Zend_Acl_Resource_Interface $resource = null,
$privilege = null)
{
// check the user's profile
if (null === $this->user){
return false;
}
return $this->user->isProfileComplete(); // for example
}
}
然后在定义 Acl 对象时:
$user = Zend_Auth::getInstance()->getIdentity();
$assertion = new My_Acl_Assertion_IsProfileComplete($user);
$acl->allow($role, $resource, $privilege, $assertion);
当然,一些细节取决于你需要检查的细节以及你可以使用的细节取决于你在Zend_Auth::setIdentity()
调用中存储的内容——只有一个用户 ID、一个完整的用户对象等。以及角色、资源,并且权限是完全特定于应用程序的。但希望这给出了这个想法。
此外,由于断言对象在实例化时需要用户对象,因此无法在 Bootstrap 中添加此动态规则。但是,您可以在引导期间使用静态规则创建核心 Acl 实例,然后注册一个preDispatch()
添加动态断言的前端控制器插件(例如运行在 )。这样,当您到达控制器时,Acl 已完全填充,您可能会在其中检查它们。
只是大声思考。