SOHOゆいちのサイト
Bsheの開発の中で、アクセス権をZend_Authを利用して、ログインしているかどうかで判別してしまっていたのですが、アクセス権制御が今後必要になるなと感じてZend_Aclを少し使ってみました。
前提として
実際の実装はBsheの以下のクラスを参考にしてください。(ダウンロードはこちら)
以下のようなINIファイル(pwd.ini)を用意します。(Bshe上ではini/pwd.ini)
[Auth]
users.admin = password
上記では、IDがadminパスワードがpasswordとなるイメージです。(IDはそのままrole名としても利用します)
class My_Acl extends Zend_Acl
{
/**
* construct
*
* @return void
*/
public function __construct ()
{
try {
$this->_registRole();
$this->_registResource();
} catch( Exception $e) {
throw new Zend_Exception ( __METHOD__ .":" . $e->getMessage(), Zend_Log::ERR ) ;
}
}/**
* アクセス管理role情報をINIファイルから取得
*
* @return void
*/
protected function _registRole()
{
try {
$pwdConfig = New Zend_Config_Ini(‘pwd.ini’, ‘Auth’, array(‘allowModifications’ => true));$arrayRoles = $pwdConfig->users->toArray();
$this->addRole(new Zend_Acl_Role(‘admins’));
foreach ($arrayRoles as $key => $role) {
$this->addRole(new Zend_Acl_Role($key), ‘admins’);
}return;
} catch (Exception $e) {
throw $e;
}
}/**
* リソースセット(nullのみ)
*
* @return unknown_type
*/
protected function _registResource()
{
try {
$this->allow(‘admins’, null, null);
} catch (Exception $e) {
throw $e;
}
}
}
とりあえず内容をざっと説明すると
public function __construct ()
インスタンス化した際に、roleとresourceを初期化します。
protected function _registRole()
iniファイルからroleの配列を取得して、addRoleします。
protected function _registResource()
今回は全ユーザーadminsというroleに所属するためadminsにすべてのリソース(null)へのアクセス権をセットします。
class My_Acl_Factory
{
static protected $_acl;/**
* Aclクラスを返す
*
* @return unknown_type
*/
static public function getAcl()
{
if (self::$_acl == null) {
$className = ‘My_Acl’;
self::$_acl = New $className();
}
return self::$_acl;
}/**
* Bshe_Specializer_Authの認証情報から
* 対象のアクセス権を確認する。
*
* @param $resource
* @param $pri
* @return unknown_type
*/
static public function isAllowedByUserid($resource = null, $priv = null)
{
try {
$auth = Zend_Auth::getInstance();
if ($auth->hasIdentity()) {
$acl = self::getAcl();
// ログイン中
$arrayIdentitys = $auth->getIdentity();
$role = $arrayIdentitys['userid'];
if ($acl->has($resource)) {
return $acl->isAllowed($role, $resource, $priv);
} else {
return $acl->isAllowed($role, null, null);
}
} else {
// ログインしていない
return false;
}
} catch (Exception $e) {
throw $e;
}
}
}
static protected $_acl;
Aclクラスのインスタンスを保持します。
static public function getAcl()
インスタンスを生成するfactoryメソッドです。(将来、利用するAclを切り替えるときはこのメソッドを書き換えます。
static public function isAllowedByUserid($resource = null, $priv = null)
実際にはこのメソッドを各所からstaticに呼び出して権限のチェックを行います。
Zend_Authで認証されたユーザーのuseridと引数のresourceとprivからアクセス権をチェックしています。
www.bshe.org (created by itassist.info)