この一連の記事を除いて、インターネットで何も見つけられなかったので、すべてを自分で書くことにしました。
それでは始めましょう。
ベース
ロール、リソース、アクセス権に関する情報をデータベースに保存します。 ベースの構造はほぼ次のとおりです。
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