最初に、サイトへのアクセスを許可する前に、ユーザー アカウントがアクティブ化されているかどうか、およびユーザーが管理者によって禁止されているかどうかという、users テーブルの 2 つの追加パラメーターをテストしたいと思います。
Zend_Auth_Adapter_DbTable
チュートリアル コードでは、認証に特定の API を使用するバニラ バージョンを使用します。Zend_Auth を思いどおりに機能させることはそれほど難しくありませんが、実装する必要があるため、多少の考慮が必要ですZend_Auth_Adapter_Interface
。さらに悪いことに、authenticate()
メソッドを実装するだけで済みます。の代わりに使用できる認証アダプターの例を次に示しますZend_Auth_Adapter_DbTable
。
<?php
//some code truncated for length and relevance
class My_Auth_Adapter implements Zend_Auth_Adapter_Interface
{
protected $identity = null;
protected $credential = null;
protected $usersMapper = null;
public function __construct($username, $password, My_Model_Mapper_Abstract $userMapper = null)
{
if (!is_null($userMapper)) {
$this->setMapper($userMapper);
} else {
$this->usersMapper = new Users_Model_Mapper_User();
}
$this->setIdentity($username);
$this->setCredential($password);
}
/**
* @return \Zend_Auth_Result
*/
public function authenticate()
{
// Fetch user information according to username
$user = $this->getUserObject();
if (is_null($user)) {
return new Zend_Auth_Result(
Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND,
$this->getIdentity(),
array('Invalid username')
);
}
// check whether or not the hash matches
$check = Password::comparePassword($this->getCredential(), $user->password);
if (!$check) {
return new Zend_Auth_Result(
Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID,
$this->getIdentity(),
array('Incorrect password')
);
}
// Success!
return new Zend_Auth_Result(
Zend_Auth_Result::SUCCESS,
$this->getIdentity(),
array()
);
}
// public function setIdentity($userName)
// public function setCredential($password)
// public function setMapper($mapper)
/**
* @return object
*/
private function getUserObject()
{
return $this->getMapper()->findOneByColumn('username', $this->getIdentity());
}
/**
* @return object
*/
public function getUser()
{
$object = $this->getUserObject();
$array = array(
'id' => $object->id,
'username' => $object->username,
'role' => $object->getRoleId()
);
return (object) $array;
}
// public function getIdentity()
// public function getCredential()
// public function getMapper()
}
認証アダプターを変更して、必要なことをほとんど行うことができます。
アクセス リストに関する限り、覚えておくべきことは、リソースが文字列によって定義されるということです。このチュートリアルの場合、リソースは次のように定義されます。
$this->add(new Zend_Acl_Resource('error::error'));
ここで、コロンの左側の文字列はコントローラーを表し、コロンの右側の文字列はアクションを表します。リソースが何であるかを教えてくれるのは、acl プラグインの次の行です。
if(!$acl->isAllowed($user->role, $request->getControllerName() . '::' . $request->getActionName()))
リソースが何を表すかについてのこの定義を、自分に適したものに変更できます。
ACL の実装方法について厳格なルールを提供することは非常に困難です。プロジェクトごとに必要なものが異なるように思われるからです。
Web を見回すと、Zend Framework ACL のいくつかの異なる実装が見つかります。それらのいくつかは非常に複雑な場合があります。
これは、より多くの洞察を提供する可能性のあるものです。http://codeutopia.net/blog/2009/02/06/zend_acl-part-1-misconceptions-and-simple-acls/
幸運を