--兼談許可權系統設計的一些問題
zend framework 作為 php 的乙個官方程式設計框架,剛一推出來就引起了震動,大家把它簡稱為「zf」。看來 php 已經在尋求向企業開發市場進軍。但是由於推出時間短,熟悉 zf 的開發人員,特別是國內的程式設計師,對 zf 了解的還不多。現在市面上還找不到一本專門介紹 zf 的圖書,現有的資料,大部分是英文版,zend 公司與中國公司合作翻譯的 zend framework 中文手冊,還是個爛尾工程,而且是 1.0 或 1.2 版本的,最新的 zf 1.5.1 資料更少。而用 zf 全程編寫的產品更是鳳毛麟角。
有人說,zf 簡直就是 ror 的翻版,看來 zf 應該具有當前流行的動態語言的優點,特別是對 mvc 的良好支援,
了解 zf 的人,應該對 zf 的許可權管理印象深刻。zf 手冊在第一章的簡介之後,第二章就拉出 zend_acl(訪問控制授權)來介紹,而第三章就是zend_auth 的內容(認證)。從知識認知的順序上,我個人感覺這樣安排的不合適的。事實上第二和第三章的內容介紹,牽扯了眾多後續章節的內容,我們不得不從第 7 章 zend_controller 開始看起。
但是不得不承認 zf 的認證和授權是個優秀的設計。zf 的認證相對簡單,我們可以直接連線資料庫表,對使用者輸入的使用者名稱和密碼進行比較,確認當前使用者的身份。還提供了摘要式認證等方法。而 acl(訪問控制列表)提供的授權就很強大。
acl 提出了資源、角色、動作(訪問)三個概念,用這些概念可以輕易構造乙個強大的許可權管理系統。而且許可權管理可以細化到模組下的瀏覽、新增、刪除、修改等細微動作。(asp.net 只能控制到頁面(模組)級別,更細緻的控制需要程式設計師自己設計和實現)。這裡粘一些**,僅僅是說明一下(在 iis6.0 + zf1.51 + apache2.2 下除錯的):
//4種角色:admin, editor, guest, auditor, poweruser
//4種資源:channel, item, bbs, blog
//3種動作:view, edit, revise
//要求:
//admin對所有資源有所有許可權
//guest對所有資源只有view許可權
//editor對channel, item, bbs有view, edit許可權
//auditor對channel, item, bbs, blog有revise許可權
//poweruser繼承editor, auditor許可權
//定義角色
$acl = new zend_acl();
$roleadmin = new zend_acl_role('admin');
$acl->addrole($roleadmin);
$roleeditor = new zend_acl_role('editor');
$acl->addrole($roleeditor);
$roleguest = new zend_acl_role('guest');
$acl->addrole($roleguest);
$roleauditor = new zend_acl_role('auditor');
$acl->addrole($roleauditor);
$rolepoweruser = new zend_acl_role('poweruser');
$acl->addrole($rolepoweruser, array('editor', 'auditor'));
//新增資源
$acl->add(new zend_acl_resource('channel'));
$acl->add(new zend_acl_resource('item'));
$acl->add(new zend_acl_resource('bbs'));
$acl->add(new zend_acl_resource('blog'));
//分配許可權
//admin:
$acl->allow($roleadmin, null, null);
//editor:
$acl->allow('editor', array('channel', 'item', 'bbs'), array('view', 'edit'));
//guest:
$acl->allow('guest', null, 'view');
//auditor:
$acl->allow('auditor', array('channel', 'item', 'bbs', 'blog'), array('revise'));
//poweruser(從 editor, auditor 繼承許可權),可以再疊加另外的許可權
//$acl->allow('poweruser', null, null);
//給所有角色分配許可權(包括 admin)
//$acl->allow(null, '', '');
//$acl->deny(null, '', '');
foreach (array('admin', 'editor', 'guest', 'auditor', 'poweruser') as $role)
echo '';
}echo '';}}
這些資源、角色、動作,在以上**片段裡,是作為硬編碼存在的,實際專案中,可以作為資料在資料庫裡儲存。靈活應用就需要程式設計師的智慧型了。
zf 的使用者,只劃分到「角色」這一級,也就是說,不能給某個使用者直接分配許可權。這肯定是出於簡化設計而考慮的,否則設計和實現會複雜的多!這個有個小缺點,就是要為乙個使用者分配許可權,必須首先建乙個角色(相當於使用者組),再把該使用者加入到該角色下,通過角色來給該使用者分配許可權。而許可權設計中,使用者、角色、資源、動作的相互包含、交叉,其結果導致問題變得非常複雜!這麼複雜的邏輯關係,不借助其他工具(例如計算機),人的大腦大多數情況下是很難想明白的。
張慶(網眼)
2008-5-8
Zend Framework 中的認證和授權淺見
兼談許可權系統設計的一些問題 zend framework 作為 php 的乙個官方程式設計框架,剛一推出來就引起了震動,大家把它簡稱為 zf 看來 php 已經在尋求向企業開發市場進軍。但是由於推出時間短,熟悉 zf 的開發人員,特別是國內的程式設計師,對 zf 了解的還不多。現在市面上還找不到一...
ZendFramework中的分頁類實現
參考自 http www.phpfans.net ask question2 7822122562.html 其實上文寫得比較清楚了,我這也只是把上面的方法推廣一下而已。主要是分頁類的實現。如上 件結構所示,在library目錄下新建custom模組。各個檔案的 依次是 mysql.php requ...
ZendFramework中領域邏輯的處理
zendframework一直為人所詬病的缺點就是不能優雅的處理領域邏輯,這裡談談我的一些解決思路 先看看一般情況下我們都是怎麼寫model,controller的 model的一般寫法 class articles extends zend db table controller的一般寫法 cla...