My_Acl

My_AclはZend_Aclの拡張コンポーネントクラスです。http/httpsの設定を行い、特定のページをhttpsでのアクセスのみ許可するMy_Acl_Httpsと、ユーザのロールに合わせてアクセスを許可するMy_Acl_Userがあります。いずれも、判定を行う対象のリソースをモジュールやコントローラ、アクションに基づいたものにする事により設定を行いやすくしてあります。Zend_Aclのリファレンスは下記ページをご覧ください。

http://framework.zend.com/manual/ja/zend.acl.html

My_Acl_Https

My_Acl_Httpsは画面別にhttpとhttps通信の許可判定を行います。許可の設定は下記のコンフィグファイルにより設定します。

  • application
    • configs
      • acl_https.ini

コンフィグファイルには初期状態ではこのように書かれています。

[default]
rule[] = "allow.http"

[cron]
rule[] = "allow.http"

[admin]
rule[] = "deny.http"
rule[] = "allow.http.error"
rule[] = "allow.https"

My_Acl_Httpsの設定方法

各モジュール別に(許可か拒否か).(スキーマ).(対象のコントローラ)というフォーマットによりルールを記述していきます。Zend Acl同様、複数のルールがある場合には上に書かれたルールから順に追加されていきます。

(許可か拒否か)には許可であればallow、拒否であればdenyを入れます。他の値は許可されません。(スキーマ)にはhttpかhttpsを入れます。(対象のコントローラ)にはその設定を行う対象のコントローラ名を入力します。コントローラ名を省略した場合、それをデフォルト設定のルールとして扱います。

[default]
rule[] = "allow.http"

[cron]
rule[] = "allow.http"

defaultモジュールやcronモジュールは全ての画面に対してhttpでのアクセスを許可します。また、httpsはhttpを継承しており、ルールを上書きしない限りhttpのルールはhttpsにも適用されるため、httpsでのアクセスも許可されます。

[admin]
rule[] = "deny.http"
rule[] = "allow.http.error"
rule[] = "allow.https"

adminモジュールはhttpではエラー画面以外はアクセス不許可、httpsでアクセス許可という事を示します。

My_Acl_Httpsの判定はpreDispatch中の共通処理として呼び出されています。iniファイルの設定を書き換えれば他の処理を記述しなくてもそのまま反映されます。また、params.ini中にあるssl_enableを0とすると、判定は行われなくなります。SSLを導入していない環境の場合は0としてください。なお、ダウンロードしたソースファイルでは初期設定は0としてあります。

My_Acl_User

My_Acl_Userは画面別にユーザロールに合わせた許可判定を行います。許可の設定は下記のコンフィグファイルにより設定します。

  • application
    • configs
      • acl_user.ini

コンフィグファイルには初期状態ではこのように書かれています。

[admin]
role[] = "viewer"
role[] = "manager.viewer"

;rule[] = "allow.viewer"
;rule[] = "deny.viewer.__all__.add"
;rule[] = "deny.viewer.__all__.edit"
;rule[] = "deny.viewer.__all__.delete"
;rule[] = "allow.manager.__all__.add"
;rule[] = "allow.manager.__all__.edit"
;rule[] = "allow.manager.__all__.delete"

rule[] = "deny.viewer"
rule[] = "allow.manager"
rule[] = "allow.viewer.__all__.index"
rule[] = "allow.viewer.__all__.view"

My_Acl_Userと異なる点として、初期状態ではadminモジュールに対してのみ判定を行うようになっています。他のモジュールに対してもユーザロールの判定を行いたい場合や、adminモジュールの判定を拡張したい場合はそれに合わせた実装を行う必要があります。

My_Acl_Userの設定方法

roleにより、使用するロール名を指定します。他のロールの継承をしたい場合には、末尾に.(継承するロール名)として下さい。

各モジュール別に(許可か拒否か).(ロール名).(対象のコントローラ).(対象のアクション)というフォーマットによりルールを記述していきます。Zend Acl同様、複数のルールがある場合には上に書かれたルールから順に追加されていきます。

(許可か拒否か)には許可であればallow、拒否であればdenyを入れます。他の値は許可されません。(ロール名)にはroleで設定したいずれかのロール名を入れます。(対象のコントローラ)にはその設定を行う対象のコントローラ名を入力します。(対象のアクション)には対象のアクション名を入力します。コントローラ名やアクション名を省略した場合、それをそのロールにおけるデフォルト設定のルールとして扱います。このほか、コントローラに__all__と入力する事で全てのコントローラの同一アクションに対してルールを設定する事ができます。

rule[] = "deny.viewer"
rule[] = "allow.manager"
rule[] = "allow.viewer.__all__.index"
rule[] = "allow.viewer.__all__.view"

サンプルではviewerは全てのコントローラに対してindexとviewアクションのみ許可、managerは全てのアクションを許可しているというルールになります。

[admin]
;rule[] = "allow.viewer"
;rule[] = "deny.viewer.__all__.add"
;rule[] = "deny.viewer.__all__.edit"
;rule[] = "deny.viewer.__all__.delete"
;rule[] = "allow.manager.__all__.add"
;rule[] = "allow.manager.__all__.edit"
;rule[] = "allow.manager.__all__.delete"

コメントアウトしたルールでは、viewerはadd、edit、deleteアクションを許可するようになっています。サンプルではadminモジュールにはindex、add、edit、view、deleteアクションしかないため、コメントアウトしたものに置き換えても同じ意味を持ちます。

My_Acl_Userの実行方法について

先に書いたとおり、初期状態ではadminモジュールに対してのみ設定されています。他のモジュールでも判定を行いたい時や、ユーザのロールを変更したい時には変更を記述する必要があります。ここでは実際に書かれている処理を例に説明します。

appControllerのメソッド、adminPreDispatch中に次のような処理があります。

$session = new Zend_Session_Namespace('admin');
$acl = new My_Acl_User();
$member = new Model_Member();

$role = $member->getRoleName($session->role_id);
if(!$acl->isAllowed($role) && $controller != 'error'){
    throw new Zend_Exception('PARMISSION_DENIED');
}

Model_Member::getRoleName($role_id)メソッドによりロール名を取得し、My_Acl_User::isAllowed($role)により判定を行います。My_Acl_Userは初期化した時点でコンフィグファイルやコントローラ情報を取得するため、情報のセットは不要です。

なお、エラーコントローラはACLで不許可と判定されてもエラー画面を表示する必要があるため、例外的に判定を除外しています。このようにしないとエラー画面を表示しようとした時に転送がループする事があります。