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に保存とかそんな馬鹿な設計を勧めないでください。
なお、resourcetableテーブルのカラムがリソース、レコードがひとつのロールとなります。
あとは認可制御したいプログラムの冒頭に$acl->isAllowed($user->getRole(), 'hogeResource' )とか書けば簡単に認可制御することが可能です。
いや、あれだ、('SELECT sampleResource FROM resourceTable WHERE role = ? ', $user->getRole())とか書いたほうがわざわざ権限テーブル全取得してZend_Aclに突っ込んだりするとかいう無駄がないぶんよっぽど早いとかそういうことは秘密だ。
> とても簡単に認可制御が行えました。
> あとは各ユーザ毎に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
トラックバック
トラックバックURL: