zend框架——如何将Zend_Ath、Zend_Acl和partialview结合起来进行身份验证和资源控制



According to Randomness会让你无处不在。瑞安的博客不需要Zend框架的操作堆栈组件,并且可以将部分视图与Zend_Acl和Zend_Auth结合起来,以实现对资源的身份验证和控制。

我没能在谷歌上找到任何合适的例子来说明它是如何完成的。会很高兴是有人会善良地告诉我如何实现这一点。由于

给你:

可以使用Zend_AuthZend_Acl的组合。为了扩展其他答案,我提供了一个简短的示例,说明如何使用zend框架管理身份验证:

首先,你需要设置一个插件来预调度所有请求,并检查客户端是否被允许访问某些数据。这个插件可能看起来像这样:

class Plugin_AccessCheck extends Zend_Controller_Plugin_Abstract {
    private $_acl = null;
    public function __construct(Zend_Acl $acl) {
        $this->_acl = $acl;
    }
    public function preDispatch(Zend_Controller_Request_Abstract $request) {
        //get request information
        $module = $request->getModuleName ();
        $resource = $request->getControllerName ();
        $action = $request->getActionName ();
        try {
            if(!$this->_acl->isAllowed(Zend_Registry::get('role'), 
                                $module . ':' . $resource, $action)){
                $request->setControllerName ('authentication')
                        ->setActionName ('login');
            }
        }catch(Zend_Acl_Exception $e) {
            $request->setControllerName('index')->setActionName ('uups');
        }
    }
}

因此,每种用户类型都具有在acl库中定义的特定权限。对于每个请求,检查是否允许用户访问资源。如果没有重定向到登录页面,则preDispatch将用户传递给资源。

Zend_Acl中定义角色,资源和权限,允许或拒绝访问,例如:

class Model_LibraryAcl extends Zend_Acl {
    public function __construct() {
        $this->addRole(new Zend_Acl_Role('guests'));
        $this->addRole(new Zend_Acl_Role('users'), 'guests');
        $this->addRole(new Zend_Acl_Role('admins'), 'users');                
        $this->add(new Zend_Acl_Resource('default'))
             ->add(new Zend_Acl_Resource('default:authentication'), 'default')
             ->add(new Zend_Acl_Resource('default:index'), 'default')
             ->add(new Zend_Acl_Resource('default:error'), 'default');
        $this->allow('guests', 'default:authentication', array('login'));
        $this->allow('guests', 'default:error', 'error');
        $this->allow('users', 'default:authentication', 'logout');          
    }
}

然后你必须在引导文件中设置acl和auth:

    private $_acl = null;
    protected function _initAutoload() {
       //...your code           
       if (Zend_Auth::getInstance()->hasIdentity()){
        Zend_Registry::set ('role',
                     Zend_Auth::getInstance()->getStorage()
                                              ->read()
                                              ->role);
        }else{
            Zend_Registry::set('role', 'guests');
        }
        $this->_acl = new Model_LibraryAcl ();
        $fc = Zend_Controller_Front::getInstance ();
        $fc->registerPlugin ( new Plugin_AccessCheck ( $this->_acl ) );
        return $modelLoader;
    }

最后,在您的身份验证控制器中,您必须使用自定义的认证适配器并设置登录和注销操作:

public function logoutAction() {
    Zend_Auth::getInstance ()->clearIdentity ();
    $this->_redirect ( 'index/index' );
}
private function getAuthAdapter() {
    $authAdapter = new Zend_Auth_Adapter_DbTable ( 
                        Zend_Db_Table::getDefaultAdapter ());
    $authAdapter->setTableName('users')
                ->setIdentityColumn('email')
                ->setCredentialColumn ('password')
                ->setCredentialTreatment ('SHA1(CONCAT(?,salt))');
    return $authAdapter;
}

在您的登录操作中,您需要将登录数据传递给执行身份验证的授权适配器。

$authAdapter = $this->getAuthAdapter ();
$authAdapter->setIdentity ( $username )->setCredential ( $password );
$auth = Zend_Auth::getInstance ();
$result = $auth->authenticate ( $authAdapter );
if ($result->isValid ()) {
    $identity = $authAdapter->getResultRowObject ();
    if ($identity->approved == 'true') {
        $authStorage = $auth->getStorage ();
        $authStorage->write ( $identity );
        $this->_redirect ( 'index/index' );
    } else {
       $this->_redirect ( 'authentication/login' );
  }

就这些。我推荐你在youtube上zend auth和zend acl上学习HOW TO。

您可能会发现以下关于Action helper的文章很有用,如果有新站点,我建议您浏览一下,因为它们也有关于实现Zend_Auth的文章:

  • 使用动作帮助器实现可重用的小部件
  • Jon Lebensold介绍Action Helpers
  • 在Zend框架中使用动作助手
  • ZF参考指南:Action Helpers官方文档

相关内容

  • 没有找到相关文章

最新更新