忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/06/23 10:45 |
ZF1.11 Zend_Aclその2
http://yuubiseiharukana.blog.shinobi.jp/Entry/724/
> とても簡単に認可制御が行えました。
> あとは各ユーザ毎にmemberかadminかを示すフラグを設定すれば完成、めでたしめでたし。



なわけがない。

今時権限をソースにベタ書きとかねーよ普通管理画面から制御してDB保存だろ。
とまあそこらへんの大事なところを

http://framework.zend.com/manual/ja/zend.acl.advanced.html
> Zend_Acl はシリアライズ可能なので、ACL オブジェクトを PHP の ≫ serialize() 関数でシリアライズできます。
> シリアライズした結果を、 ファイルやデータベースあるいはキャッシュなどのお好みの場所に保存できます。


とかたった数行で流してくれやがっています。
ていうかシリアライズした結果をDBに保存とかそんな馬鹿な設計を勧めないでください。
CREATE TABLE `resourcetable` (
 `roleName` varchar(255) NOT NULL,
 `sampleResource` tinyint(1) NOT NULL,
 `hogeResource` tinyint(1) NOT NULL,
 `fugaResource` tinyint(1) NOT NULL,
 PRIMARY KEY (`roleName`)
)
<?php
	//Zend_Acl
	require_once('Zend/Acl.php');
	$acl = new Zend_Acl();
	
	//DB
	require_once('Zend/Db.php');
	$db=Zend_Db::factory('Pdo_Mysql', array( 'host'=>'localhost', 'username'=>'testuser', 'password'=>'testpass', 'dbname'=>'testdb' ));
	//リソーステーブルを取得
	$select = $db->select()->from('resourcetable');
	$stmt = $select->query();
	$result = $stmt->fetchAll();
	
	//リソースをZend_Aclに登録
	foreach($result[0] as $key=>$val){
		if($key==='roleName'){continue;}
		$acl->add(new Zend_Acl_Resource($key));
	}
	
	//ロールと権限をZend_Aclに登録
	foreach($result as $record){
		foreach($record as $resource=>$column){
			if($resource==='roleName'){
				$role = $column;
				$acl->addRole(new Zend_Acl_Role($role));
				continue;
			}
			switch($column){
				case 1:
					$acl->allow($role, $resource);
					break;
				default:
					$acl->deny( $role, $resource);
					break;
			}
		}
	}
	
	//確認
	var_dump($acl->isAllowed('role1', 'sampleResource'));
任意にロールやリソースの種類を増やしても問題無く動作するようになりました。
なお、resourcetableテーブルのカラムがリソース、レコードがひとつのロールとなります。

あとは認可制御したいプログラムの冒頭に$acl->isAllowed($user->getRole(), 'hogeResource' )とか書けば簡単に認可制御することが可能です。


いや、あれだ、('SELECT sampleResource FROM resourceTable WHERE role = ? ', $user->getRole())とか書いたほうがわざわざ権限テーブル全取得してZend_Aclに突っ込んだりするとかいう無駄がないぶんよっぽど早いとかそういうことは秘密だ。
PR


2012/01/27 23:39 | Comments(0) | TrackBack(0) | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<Minecraft1.0 MOD紹介 ManaSys v6.1 その2 炎魔法 ファイアボール、フレームエンチャント、ハイパーフィーバー、インフェルノチャーム | HOME | Minecraft1.0 MOD紹介ExpMachine 1.6.1 経験値を入手できるMOD>>
忍者ブログ[PR]