Zend_Aclを使ってみる  2009年4月20日

Bsheの開発の中で、アクセス権をZend_Authを利用して、ログインしているかどうかで判別してしまっていたのですが、アクセス権制御が今後必要になるなと感じてZend_Aclを少し使ってみました。

前提として

  • ・Authクラスですでにログインしているユーザーのidentity配列に「userid」という値を保持して、それをrole名として利用します。
  • ・roleは将来はDBから取りたいですがここでの例ではiniファイルにuidとパスワードを設定したものをそのまま利用します。
  • ・resourceは設定せずに、あくまでログインしているかどうかの代わりにZend_Aclを利用して将来の拡張に備える程度で使います。
  • ・roleもadminsという1つのロールにすべてのユーザーを登録します。
  • ・実装上、ACLクラスをfactory、singleton実装したいため、管理用factoryクラスを別に作成しました。

実際の実装はBsheの以下のクラスを参考にしてください。(ダウンロードはこちら

  • ・Bshe_Specializer_Acl
  • ・Bshe_Specializer_Acl_Abstract
  • ・Bshe_Specializer_Acl_Standalone

INIファイルを用意

以下のようなINIファイル(pwd.ini)を用意します。(Bshe上ではini/pwd.ini)

[Auth]

users.admin = password

上記では、IDがadminパスワードがpasswordとなるイメージです。(IDはそのままrole名としても利用します)

ACLクラスを準備

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)へのアクセス権をセットします。

factoryクラスを準備

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からアクセス権をチェックしています。

 

 

 

 

 

このエントリをはてなブックマークに登録 このエントリをBuzzurlにブックマーク Yahoo!ブックマークに登録 このエントリをlivedoorクリップに登録 Deliciousにブックマーク

コメントを投稿