動的な役割と権利

少し前に、オンラインストアの役割と権利の動的なシステムを作成したことがありました。

この一連の記事を除いて、インターネットで何も見つけられなかったので、すべてを自分で書くことにしました。



それでは始めましょう。



ベース



ロール、リソース、アクセス権に関する情報をデータベースに保存します。 ベースの構造はほぼ次のとおりです。

acl_resources-リソース

acl_roles-ユーザー名のグループ。ロールでもあります

acl_cross-ロールとリソースの対応の交差点:



id / role_id / res_id

1 1 1

2 1 2

3 1 3



* ID = 1のロールの場合、リソース1、2、3は利用可能です



ACL



アクセス制御付きのファイルに、次のコードを記述します。

クラスAclはZend_Aclを拡張します

{

パブリック関数__construct()

{

$ model = new User();



/ **

*リソースを追加する

* /

//リソースを取得します

$ resources = $ model-> getResources();



foreach($リソースとして$ mod)

{

//そのようなリソースがまだ追加されていない場合

if(false == $ this-> has($ mod ['module'] .'_ '。$ mod [' controller ']))

{

//追加

$ this-> add(新しいZend_Acl_Resource($ mod ['module'] .'_ '。$ mod [' controller ']));

}

}



/ **

*ユーザーロールを追加する

*そしてすぐにそれらにパーミッションを付けます

* /

//役割を取得します

$ roles = $ model-> getRoles();

//各役割に対して

foreach($ロールを$ロールとして)

{

//追加

$ this-> addRole(新しいZend_Acl_Role($ role ['name']));

//このロールで利用可能なリソースを取得します

$ permissions = $ model-> getRoleResources($ role ['id']);

//これらのリソースにパーミッションを設定します

foreach($ permとしての$パーミッション)

{

$ this-> allow($ role ['name']、

$ perm ['module'] .'_ '。$ perm [' controller ']、

$ perm ['action']);

}

}

}

}

したがって、データベースのレコードを処理し、実際にACLを作成します。



プラグイン



次に、コントロールをプラグインに転送します。 プラグインは、コントローラーレベルでアクセス権を処理します。 まあ、これは、たとえば、通常のユーザーが製品を削除するアクションへのモデレーターリンクをコピーした場合、許可されません。 サンプルコードを次に示します。



Lord_Plugin_AclクラスはZend_Controller_Plugin_Abstractを拡張します

{

private $ _acl = null;



パブリック関数__construct(Zend_Acl $ acl)

{

$ this-> _ acl = $ acl;

}



パブリック関数preDispatch(Zend_Controller_Request_Abstract $ request)

{

// Zend_Layoutオブジェクトを取得します

$ layout = Zend_Layout :: getMvcInstance();



//フォームのオブジェクトを取得します

$ view = $ layout-> getView();



$ auth = Zend_Auth :: getInstance();

//セッションリポジトリにユーザーがいる場合

if($ auth-> hasIdentity()== true)

{

//このユーザーのデータを取得します

$ user = $ auth-> getIdentity();

$ userModel = new User();

$ role = $ userModel-> getRole($ user-> role);

$ user-> roleName = $ role-> name;

}

他に

{

$ user-> roleName = 'anon';

}

//表示するビュー変数に入れます

$ view-> user = $ user;



/ * ------------------------------------------------ -------------- * /



$ request = $ this-> getRequest();



$ controller = $ request-> getControllerName();

$ module = $ request-> getModuleName();

$ action = $ request-> getActionName();



$ acl = new Acl();

$ isAllow = $ acl-> isAllowed($ user-> roleName、$ module .'_ '。$ controller、$ action);



if($ isAllow == false)

{

$ request-> setModuleName( 'user')

-> setControllerName( 'login')

-> setActionName( 'index');

}



$ view-> acl = $ acl;



/ * ------------------------------------------------ -------------- * /

}

}



ViewHelper





次に、アプリケーションビューレベルでコントロールを非表示および表示する必要があります。 これを行うには、アクセス権をチェックし、コントロールを表示または非表示にするヘルパーを作成します。



Lord_View_Helper_Aclクラス

{

パブリック関数Acl($ module = 'default'、

$コントローラー= 'インデックス'、

$ action = 'index')

{

// Zend_Layoutオブジェクトを取得します

$ layout = Zend_Layout :: getMvcInstance();



//フォームのオブジェクトを取得します

$ view = $ layout-> getView();



$ acl = new Acl();

$ isAllow = $ acl-> isAllowed($ view-> user-> roleName、$ module .'_ '。$ controller、$ action);



if($ isAllow == false)

{

falseを返します。

}

他に

trueを返します。



}

}



ビュースクリプトでヘルパーを記述した後、次のコードのようなものを記述してコントロールを非表示または表示するだけで十分です。



<?if($ this-> acl( 'store'、 'categories'、 'add')== true):?>

<img src = "<?= $ this-> imagesUrl?> icons / icon_add.png"

title = "<?= $ this-> translate( 'store_category_primary_add');?>">



<?endif;?>



その結果、Webインターフェイスから任意のモジュール/コントローラー/アクションの任意のグループに権限を配布できるシステムができました。



ダウンロードする少しのコード:

- ベース

- プラグイン

-ViewHelper

-ACL



All Articles