使用Zend进行隐私控制

时间:2012-07-31 22:32:06

标签: php zend-framework

我正在使用Zend创建一个社交网站。该网站允许用户成为朋友并访问彼此的个人资料和博客。我还希望用户能够控制他们的隐私,这可以采用“仅限朋友”和“公共”参数。我看了Zend_Acl但它似乎只能处理单个用户的可访问性而不是用户有关系。关于最佳方法的任何想法?

1 个答案:

答案 0 :(得分:0)

出于您的目的,如果您使用Zend_Acl,则应该查看assertions

鉴于应用程序中用户之间关系的复杂性,您将查询的大多数访问规则看起来都非常动态,因此它们将主要依赖于可以使用更复杂的逻辑来确定可访问性的断言。

您应该能够使用Zend_Acl完成您想要的任务。

您可以设置如下的ACL规则:

$acl->allow('user', 'profile', 'view', new My_Acl_Assertion_UsersAreFriends());

ACL断言本身:

<?php

class My_Acl_Assertion_UsersAreFriends implements Zend_Acl_Assert_Interface
{
    public function assert(Zend_Acl $acl,
                           Zend_Acl_Role_Interface $role = null,
                           Zend_Acl_Resource_Interface $resource = null,
                           $privilege = null)
    {
        return $this->_usersAreFriends();
    }

    protected function _usersAreFriends()
    {
        // get UserID of current logged in user
        // assumes Zend_Auth has stored a User object of the logged in user
        $user   = Zend_Auth::getInstance()->getStorage();
        $userId = $user->getId();

        // get the ID of the user profile they are trying to view
        // assume you can pull it from the URL
        // or your controller or a plugin can set this value another way
        $userToView = $this->getRequest()->getParam('id', null);

        // call your function that checks the database for the friendship
        $usersAreFriends = usersAreFriends($userId, $userToView);

        return $usersAreFriends;
    }
}

现在有了这个断言,如果2个用户ID不是朋友,访问将被拒绝。

检查如下:

if ($acl->isAllowed('user', 'profile', 'view')) {
    // This will use the UsersAreFriends assertion

    // they can view profile
} else {
    // sorry, friend this person to view their profile
}

希望有所帮助。