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