Phalconのアクセス制御リストACL

今日は、Phalconのアクセス制御リストACLについて調べてみたいと思います。

Phalocn\Aclは、ACLを簡単かつ軽量な管理だけでなく、それらに添付のアクセス権を提供しています。Access Control List(ACL)は、アプリケーションがリクエストする、その地域や基礎となるオブジェクトへのアクセスを制御することができます。あなたは、その概念に精通するようにACLの方法論についての詳細を読むことが奨励される。

要約すると、ACLは役割とリソースを持っている。リソースはACLで、それらに定義された権限を順守するオブジェクトです。ロールは、リソースへのアクセスをリクエストし、ACLメカニズムによって許可またはアクセスを拒否することができるオブジェクトです。

ACLの生成

このACLコンポーネントは、最初にメモリに動作するように設計されています。これは、リストのあらゆる側面にアクセスする際に使用する、スピードのしやすさを提供します。Phalcon\Aclコンストラクタは、その最初のパラメータとして制御リストに関連する情報を取り戻すために使用されるアダプタを取ります。メモリアダプタを使用した例を以下に示します。

<?php $acl = new \Phalcon\Acl\Adapter\Memory();

デフォルトでは、Phalcon\Aclは、まだ定義されていないリソース上のアクションへのアクセスを可能にします。アクセスリストのセキュリティレベルを高めるために、デフォルトのアクセス·レベルの「拒否」のレベルを定義することができます。

<?php

// Default action is deny access
$acl->setDefaultAction(Phalcon\Acl::DENY);

ACLへのロールの追加

ロールは、アクセスリスト内の特定のリソースにアクセスすることはできるか、できないかのオブジェクトです。例として、組織内の人々のグループとしてのロールを定義します。Phalcon\Acl\Roleクラスでは、より構造化された方法でロールを作成することが可能です。私たちの最近作成したリストにいくつかのロールを追加してみましょう:

<?php
// いくつかのロールを作成
$roleAdmins = new \Phalcon\Acl\Role("Administrators", "Super-User role");
$roleGuests = new \Phalcon\Acl\Role("Guests");
// ACLに "Guests"ロールを追加
$acl->addRole($roleGuests);
// Phalcon\Acl\Role以外で、"Designers"ロールを追加
$acl->addRole("Designers");

ご覧のように、ロールがインスタンスを使用せずに直接定義されています。

リソースの追加

リソースは、アクセス制御が設定されているオブジェクトです。通常、MVCアプリケーションのリソースは、コントローラを参照してください。これは必須ではないが、Phalcon\Acl\Resourceクラスは、リソースを定義するのに使用することができる。それは、ACLが制御する必要があるかを理解できるように、リソースに関連するアクションや操作を追加することが重要です。

<?php
// "Customers"リソースを定義
$customersResource = new \Phalcon\Acl\Resource("Customers");
// "customers"リソースをオペレーションの対として追加
$acl->addResource($customersResource, "search");
$acl->addResource($customersResource, array("create", "update"));

アクセス制御の定義

今、私たちはロールとリソースを持っています。それはロールがリソースにアクセスできるACLすなわちを定義する時間です。この部分は、特にあなたのデフォルトのアクセスレベルは「許可」または「拒否」を考慮して取得することが非常に重要です。

<?php
// リソースへロールのアクセスレベルをセット
$acl->allow("Guests", "Customers", "search");
$acl->allow("Guests", "Customers", "create");
$acl->deny("Guests", "Customers", "update");

allowメソッド(許可)は、特定のロールが特定のリソースにアクセスするためのアクセス権を付与していることを表します。denyメソッド(否定)は、その逆の事をします。

ACLの照会

一度リストは、完全に定義されています。私たちは、ロールが与えられた権限を持っているかいないかをチェックするためにそれを照会することができます。

<?php
// ロールがオペレーションへアクセスできるかどうかをチェックします。
$acl->isAllowed("Guests", "Customers", "edit"); //Returns 0
$acl->isAllowed("Guests", "Customers", "search"); //Returns 1
$acl->isAllowed("Guests", "Customers", "create"); //Returns 1

ロールの継承

あなたは、Phalcon\Acl\Roleが提供する継承を使用して、複雑なロール構造を構築することができます。ロールは、このようにスーパーセットまたはリソースのサブセットへのアクセスを、他のロールから継承することができます。リストでそのロールを追加するときにロールの継承を使用するには、第2引数のパラメータとして継承されたロールを渡す必要があります。

<?php
// いくつかのロールを作成
$roleAdmins = new \Phalcon\Acl\Role("Administrators", "Super-User role");
$roleGuests = new \Phalcon\Acl\Role("Guests");
// ACLへ "Guests"ロールを追加
$acl->addRole($roleGuests);
// "Guests" のアクセスから引き継いでいる"Administrators" ロールを追加
$acl->addRole($roleAdmins, $roleGuests);

ACLリストのシリアライズ

Phalcon\Acl\インスタンスのパフォーマンス向上のために、彼らはリスト全体を再定義することなく、自由にロードできるように、APC、セッション、テキストファイルやデータベーステーブルで連載して保存することができます。下記のようにそれを行うことができます。

<?php
//ACLデータが存在するかチェック
if (!file_exists("app/security/acl.data")) {
$acl = new \Phalcon\Acl\Adapter\Memory();
//ロール、リソース、アクセス、その他の定義
// プレーンファイルにシリアライズされたリスト
 file_put_contents("app/security/acl.data", serialize($acl));
} else {
//シリアライズファイルからACLオブジェクトへリストア
 $acl = unserialize(file_get_contents("app/security/acl.data"));
}
// 必要に応じてACLリストを使用
if ($acl->isAllowed("Guests", "Customers", "edit")) {
 echo "Access granted!";
} else {
 echo "Access denied :(";
}

ACLイベント

ファルコン\ ACLはにイベントを送信することが可能であるEventsManagerを、それが本だ場合には。イベントは、タイプ「ACL」を使用してトリガされます。ブール偽を返す一部のイベントは、アクティブな動作を停止可能性があります。次のイベントがサポートされています。

イベント名 トリガ 停止可?
beforeCheckAccess ロール/リソースがアクセス権を持っているかどうかをチェックする前に発生 はい
afterCheckAccess ロール/リソースがアクセス権を持っているかどうかをチェックした後に発生 しない

次の例では、このコンポーネントにリスナーをアタッチする方法を示しています。

<?php
//イベントマネージャーの作成
$eventsManager = new Phalcon\Events\Manager();
// "acl"タイプのためにリスナーをアタッチ
$eventsManager->attach("acl", function($event, $acl) {
 if ($event->getType() == 'beforeCheckAccess') {
 echo $acl->getActiveRole(),
 $acl->getActiveResource(),
 $acl->getActiveAccess();
 }
});
$acl = new \Phalcon\Acl\Adapter\Memory();
//$aclをセットアップ
//...
//ACLコンポーネントへイベントマネージャーを結びつける
$acl->setEventsManager($eventManagers);

独自アダプタの実装

Phalcon\Acl\Adapterinterfaceのインターフェイスは、独自のACLアダプタを作成したり、既存のものを拡張するために実装する必要があります。

本日は、以上です。

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

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ