Php 了解用户权限以及如何应用它

Php 了解用户权限以及如何应用它,php,zend-framework,permissions,user-permissions,socialengine,Php,Zend Framework,Permissions,User Permissions,Socialengine,我正在为一个使用Zend框架的站点开发一个模块。我对Zend框架和Social Engine都是新手,但在OOP和MVC体系结构方面有经验,因此可以相对较快地掌握基础知识 这是我正在开发的一个测试模块,所以我刚刚构建了一个简单的模块,用户可以在其中创建、编辑或删除CD信息。然后有一个小部件,可以显示在他们喜欢的地方,显示CD信息 我现在需要设置人们可以看到的CD等的权限,所以我研究了其他模块,发现轮询模块就是一个具体的例子 看看其他模块,我意识到当你创建一些东西时,它们允许用户手动设置权限 因此

我正在为一个使用Zend框架的站点开发一个模块。我对Zend框架和Social Engine都是新手,但在OOP和MVC体系结构方面有经验,因此可以相对较快地掌握基础知识

这是我正在开发的一个测试模块,所以我刚刚构建了一个简单的模块,用户可以在其中创建、编辑或删除CD信息。然后有一个小部件,可以显示在他们喜欢的地方,显示CD信息

我现在需要设置人们可以看到的CD等的权限,所以我研究了其他模块,发现轮询模块就是一个具体的例子

看看其他模块,我意识到当你创建一些东西时,它们允许用户手动设置权限

因此,将此代码添加到我的表单以创建具有相关权限的选择框:

$auth = Engine_Api::_()->authorization()->context;
$user = Engine_Api::_()->user()->getViewer();
$viewOptions = (array) Engine_Api::_()->authorization()->getAdapter('levels')->getAllowed('ryan', $user, 'auth_view');
$viewOptions = array_intersect_key($availableLabels, array_flip($viewOptions));

$privacy = null;

if( !empty($viewOptions) && count($viewOptions) >= 1 ) {
    // Make a hidden field
    if(count($viewOptions) == 1) {
        //$this->addElement('hidden', 'auth_view', array('value' => key($viewOptions)));
        $privacy  = new Zend_Form_Element_Hidden('auth_view');
        $privacy->setValue(key($viewOptions));
        // Make select box
    } else {
        $privacy = new Zend_Form_Element_Select('auth_view');
        $privacy->setLabel('Privacy')
                ->setDescription('Who may see this CD?')
                ->setMultiOptions($viewOptions)
                ->setValue(key($viewOptions));
        /*$this->addElement('Select', 'auth_view', array(
            'label' => 'Privacy',
            'description' => 'Who may see this CD?',
            'multiOptions' => $viewOptions,
            'value' => key($viewOptions),
        ));*/
    }
}

$this->addElements(array($artist, $title, $privacy, $submit));
老实说,除了创建一个选择框并用指定的值填充外,我不完全确定这段代码做什么

因此,如果用户选择“Everyone”,每个人都应该能够删除和编辑该cd,依此类推

显然,我认为控制器必须有一些代码来处理确定用户是否有权查看每张cd等问题

因此,扫描轮询控制器时,我发现它位于控制器的init函数中:

public function init() {
    // Get subject
    $poll = null;
    if( null !== ($pollIdentity = $this->_getParam('poll_id')) ) {
        $poll = Engine_Api::_()->getItem('poll', $pollIdentity);
        if( null !== $poll ) {
            Engine_Api::_()->core()->setSubject($poll);
        }
    }

    // Get viewer
    $this->view->viewer = $viewer = Engine_Api::_()->user()->getViewer();
    $this->view->viewer_id = Engine_Api::_()->user()->getViewer()->getIdentity();

    // only show polls if authorized
    $resource = ( $poll ? $poll : 'poll' );
    $viewer = ( $viewer && $viewer->getIdentity() ? $viewer : null );
    if( !$this->_helper->requireAuth()->setAuthParams($resource, $viewer, 'view')->isValid() ) {
        return;
    }
}
$auth = Engine_Api::_()->authorization()->context;
$roles = array('owner', 'owner_member', 'owner_member_member', 'owner_network', 'registered', 'everyone');

// Populate form with current settings
$form->search->setValue($poll->search);
foreach( $roles as $role ) {
    if( 1 === $auth->isAllowed($poll, $role, 'view') ) {
        $form->auth_view->setValue($role);
    }
    if( 1 === $auth->isAllowed($poll, $role, 'comment') ) {
        $form->auth_comment->setValue($role);
    }
}

// CREATE AUTH STUFF HERE
if( empty($values['auth_view']) ) {
    $values['auth_view'] = array('everyone');
}
if( empty($values['auth_comment']) ) {
    $values['auth_comment'] = array('everyone');
}

$viewMax = array_search($values['auth_view'], $roles);
$commentMax = array_search($values['auth_comment'], $roles);
在顶部的每个操作中,它们都有一些不同的授权代码,其中一个例子是
editAction
,该代码位于顶部:

// Check auth
if( !$this->_helper->requireUser()->isValid() ) {
    return;
}
if( !$this->_helper->requireSubject()->isValid() ) {
    return;
}
if( !$this->_helper->requireAuth()->setAuthParams(null, null, 'edit')->isValid() ) {
    return;
}
同样在同一个动作中,is还有其他几个位我不明白它们在做什么,下面是轮询控制器中
editAction
的随机片段:

public function init() {
    // Get subject
    $poll = null;
    if( null !== ($pollIdentity = $this->_getParam('poll_id')) ) {
        $poll = Engine_Api::_()->getItem('poll', $pollIdentity);
        if( null !== $poll ) {
            Engine_Api::_()->core()->setSubject($poll);
        }
    }

    // Get viewer
    $this->view->viewer = $viewer = Engine_Api::_()->user()->getViewer();
    $this->view->viewer_id = Engine_Api::_()->user()->getViewer()->getIdentity();

    // only show polls if authorized
    $resource = ( $poll ? $poll : 'poll' );
    $viewer = ( $viewer && $viewer->getIdentity() ? $viewer : null );
    if( !$this->_helper->requireAuth()->setAuthParams($resource, $viewer, 'view')->isValid() ) {
        return;
    }
}
$auth = Engine_Api::_()->authorization()->context;
$roles = array('owner', 'owner_member', 'owner_member_member', 'owner_network', 'registered', 'everyone');

// Populate form with current settings
$form->search->setValue($poll->search);
foreach( $roles as $role ) {
    if( 1 === $auth->isAllowed($poll, $role, 'view') ) {
        $form->auth_view->setValue($role);
    }
    if( 1 === $auth->isAllowed($poll, $role, 'comment') ) {
        $form->auth_comment->setValue($role);
    }
}

// CREATE AUTH STUFF HERE
if( empty($values['auth_view']) ) {
    $values['auth_view'] = array('everyone');
}
if( empty($values['auth_comment']) ) {
    $values['auth_comment'] = array('everyone');
}

$viewMax = array_search($values['auth_view'], $roles);
$commentMax = array_search($values['auth_comment'], $roles);

我的问题是,我真的不太明白上面的任何一点,在坐了几天,用谷歌搜索我的手指后,如果我是100%诚实的,我仍然不知道。能否为我澄清以上任何一点,帮助向我解释一些事情,如果可能的话,我如何将我想要的权限应用于我的模块

我也不熟悉SocialEngine,但经常使用Zend框架。我会给你一些提示,如果需要的话,希望其他人能给你更多的提示

看起来SE正在使用您刚才演示的大部分代码

理解Zend_Auth是很有帮助的,但是这一部分已经完成,超出了你想做的大部分
Zend_Acl
是您可能会花费大量时间阅读的内容

理解
Zend_Auth
Zend_Acl
之间区别的关键概念是
Zend_Auth
对用户进行身份验证。也就是说,它根据某个数据库检查提供的凭据,并说此人就是他们所说的那个人,因为他们提供了正确的身份(例如用户名和密码匹配)<另一方面,code>Zend_Acl用于基于角色允许或拒绝对给定资源的访问

简单地说,
Zend_Auth
与允许用户做什么无关,只与他们所说的他们是谁无关
Zend_Acl
表示用户有权或无权访问特定功能(资源)

我还没有查看他们的代码来确认这一点,但是
Engine\u Api::\u()->user()->getViewer()->getIdentity()
似乎正在从数据库中提取用户的身份,乍一看,该身份可能是
null
或用户的
id
。他们可以用这个来判断一个人是否登录

接下来,他们似乎在调用一个名为
requireAuth
的函数,该函数可以设置auth参数或检查用户是否具有访问权限。这是基于ZF构建的Social Engine的一部分,并非特定于ZF,因此您可能需要阅读更多关于该助手如何工作的文档

我认为这个助手只是调用
Zend\u Acl::isValid()
以确定用户角色是否有权访问特定资源的间接方式
Zend_Acl
工作非常简单。您可以根据
角色授予或拒绝访问某些
资源
,并尝试访问它们。默认情况下,除非明确允许,否则拒绝访问所有资源

这个插件可能做的是创建一些新的资源,可能是
poll
,然后控制用户可以
查看什么
,或者
编辑什么

如果您阅读了Zend_Acl上的
。然后你所要做的就是弄清楚插件是如何存储角色和资源的。我猜有一种标准的方法可以将其存储在社交引擎中,并且ACL规则会根据给定用户的每个请求自动设置


希望对您有所帮助。

我将简要介绍如何使用授权,但是需要通过查看SocialEngine的代码来推断更详细的信息。值得注意的是,虽然我们没有为SocialEngine编译文档,但我们的开发人员在整个代码中都使用了PHPDocumentor风格的语法,您可以使用像Neatbeans这样的IDE(http://netbeans.org/)快速访问该信息

SocialEngine有几个控制器操作帮助器类,用于操作控制器内的查询授权:

  • 应用程序/modules/Authorization/Controller/Action/Helper/RequireAuth.php
  • 应用程序/modules/Core/Controller/Action/Helper/RequireAbstract.php
  • 应用程序/modules/Core/Controller/Action/Helper/requiredmin.php
  • 应用程序/modules/Core/Controller/Action/Helper/requireObject.php
  • 应用程序/modules/Core/Controller/Action/Helper/RequireUser.php
在大多数情况下,您只关心以下几点:

  • 应用程序/modules/Authorization/Controller/Action/Helper/RequireAuth.php
  • 应用程序/模块/核心/控制器/动作/助手/需求B
    class Authorization_Api_Core extends Core_Api_Abstract
    {
    /**
    * Constants
    */
    const LEVEL_DISALLOW = 0;
    const LEVEL_ALLOW = 1;
    const LEVEL_MODERATE = 2;
    const LEVEL_NONBOOLEAN = 3;
    const LEVEL_IGNORE = 4;
    const LEVEL_SERIALIZED = 5;