zend框架中的动态自定义ACL?

时间:2011-12-17 23:18:08

标签: php zend-framework acl zend-acl

我需要一个解决方案,允许经过身份验证的用户访问某些控制器/操作,而不是基于其用户类型:即。管理员或普通用户(虽然我可以稍后使用标准ACL添加)但是根据用户的当前状态。

例如:

他们是否是该网站的成员超过1周?

他们是否完全填写了他们的个人资料?

实际上,现在我想起来了,有点像他们在这个网站上有他们的特权和徽章。

1 个答案:

答案 0 :(得分:1)

对于您所描述的基于动态条件的测试,您可以在Zend_Acl规则中使用dynamic assertions

例如:

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就会完全填充,大概是您要检查它们。

大声思考。