2009-01-22 145 views
11

我希望有一些可以幫助我一點,我目前正在使用PHP框架開發我的第一個站點,部分站點溢出到成員區域,這是我混亂開始出現的地方,我希望普通會員能夠添加新評論並編輯自己的評論,這足夠簡單,我可以根據存儲在會話中的用戶名檢查海報名稱,但我的混淆之處在於區分「常規」 '用戶和能夠刪除和修改任何評論等的更高級別用戶,他們也應該能夠訪問該網站的管理部分。Zend Auth和ACL

我的問題是,所有用戶都應該通過同一個Zend_Auth控制器登錄,還是應該爲每種類型的用戶使用Zend_Auth單獨控制器,還是可以使用Zend_Acl處理所有這些?任何幫助,建議,文章或教程將非常感激。就我個人而言,我認爲Zend文檔在某些類中有點生澀。

在此先感謝

sico87

回答

6

是,在大多數情況下,所有的認證應該通過同一個控制器。但是,Zend Auth不是控制器類型。 Zend Auth是一種使用數據庫或http等通用身份驗證方法的API。它的工作實際上僅僅是編寫認證代碼的繁重工作。

Zend Acl是您正在尋找的區分正常用戶和特權用戶的區域。在用戶驗證並登錄之後,您只涉及Zend Acl。

您需要的大部分內容都在ZF文檔中。在閱讀Auth和Acl之前,我幾乎閱讀了所有的文檔,這對我很有意義。儘管ZF的Auth,ACL,Storage_ *和其他類非常密切地結合在一起,但它們都有着非常不同的目的。有一點時間你會看到他們很好地建立在一起。

的幾個環節,讓您開始:

Pádraic Brady's ZF Tutorial

Zend's DevZone article on ACL and MVC

18

我推薦曼寧出版的書「Zend框架在行動」作爲一個偉大的,跟上時代的,介紹這一點。它的問世爲PDF格式下載,這樣你就可以擁有它現在:)

但是,爲了回答這個特定問題:

讓我們先來定義兩個關鍵術語開始。 Zend_Auth中的「身份驗證」指身份驗證,它證明某人是他們所說的人(即登錄)。 Zend_Acl中的「A」是指授權,它證明某人有權做他們想做的事(即訪問控制)。

假設用戶只有一個角色... 將用戶的角色存儲在Zend_Auth的一部分「身份」中。 在登錄:

$auth = Zend_Auth::getInstance(); 
$identity = new stdClass(); 
$identity->user_pk = $user->getPrimaryKey(); 
$identity->user_name = $user->getName(); 
$identity->role = $user->getRole(); // select * from user_role where user_pk=xxx 
$auth->getStorage()->write($identity); 

在控制器:

$acl->add(new Zend_Acl_Resource('news')) 
->allow('defaultRole', 'news'); 

一切都在默認情況下拒絕,所以你並不真的需要指定:

->deny('defaultRole', 'news', 'add'); 

而且在控制器的代碼:

$identity = Zend_Auth::getInstance()->getIdentity(); 
if(!$acl->isAllowed($identity->role, 'news', 'add')) 
{ 
    header('Location: http://www.yoursite.com/error/unauthorized'); 
} 

如果用戶的身份不被允許執行「news-> add」,它會將它們重定向到未經授權的頁面(假設您已經創建了這樣一個頁面)。

如果用戶具有> 1的角色,您將存儲角色數組作爲他們的身份。 然後你的支票會去是這樣的:

$identity = Zend_Auth::getInstance()->getIdentity(); 
$isAllowed = false; 
foreach($identity->role as $role) 
{ 
    if($acl->isAllowed($role, 'news', 'add')) 
    { 
     $isAllowed = true; 
    } 
} 
if(!$isAllowed) 
{ // if NO ROLES have access, redirect to unauthorized page 
    header('Location: http://www.yoursite.com/error/unauthorized'); 
} 

希望有所幫助。

5

我能理解你爲什麼會感到困惑。我還是有點困惑。所以,不幸的是我無法直接回答你的問題。但是,爲了澄清我腦子裏所有這些東西,我正在做的一件事就是用'域對象'而不是數據庫記錄來思考。

我處理這個問題的策略是創建我自己的Auth適配器,它與用戶憑證一起傳遞'User Base Object'。我的'用戶基地'有點像用戶的存儲庫。

因此,Zend Auth留給了其他Zend組件的'接口',而我仍然對我的系統有更多的控制權來存儲和訪問'用戶'。 我的User_Base類可能是一個Zend Db tbl的包裝,甚至只是有一些硬編碼可用於測試。

所以在中普通

好吧,這就是我要做的。

我不會甚至會打擾Zend ACL,直到我有Auth在我的腦海清楚。


我改造遺留網站並將其轉換爲Zend的MVC

這些都是一些東西(也許非傳統),我不得不去與我的「模型」工作交手。:

  • 一個應用程序可以通過多個「用戶羣」用戶使用 - OpenID的,傳統的用戶表,新的用戶表,轉瞬即逝的客人,等
  • 客人的身份可能只是一個哈希創建時,第一到達
  • 而傳統用戶的身份可能由傳統用戶表中的ID代表
  • 用戶和user_accounts是分開的東西。不要試圖將它們混合成一個概念,因爲它可能變得複雜。
  • 系統中可能有許多不同類型的帳戶。即買家賬戶與賣家賬戶。讀者_帳戶與作家_帳戶
  • 帳戶'擁有'用戶 - '主帳戶持有人','管理超級用戶'等
  • 用戶與帳戶之間的關係由'account_users'(本地子集所有用戶都有用戶)
  • 角色arew連接到account_users(該特定帳戶的用戶)(而不是角色浮動)
  • 不要害怕在服務器上擁有多個Zend應用程序代表一個網站 - 例如管理員應用程序,會員應用程序,前端應用程序。
  • 不要害怕讓這些應用程序使用存儲在「共享模型」文件夾中的模型對象,其中只有模型代碼與位於/ application/models/foomodel文件夾中的單個應用程序直接相關。
  • 每個應用程序可以有自己的定製驗證適配器
  • 管理員身份驗證適配器可能只允許從「管理員用戶表」的用戶,而前端應用程序的驗證適配器可能可以從來賓用戶羣驗證用戶,員工,或成員用戶羣。
  • 可能是其中前端的應用程序會話被清除,並且在升降由構件會話replced當構件日誌中調校妥當情況。
  • 在任何時間(而不是試圖引用每人每Web客戶端應用程序
  • 一個用戶對象與一個來賓用戶和一個成員用戶 - 這太複雜了) -
  • 每個應用程序每個用戶一個會話(命名空間以避免與其他應用程序可能會在該域中登錄的衝突) - (與嘗試同時引用'使用它的人'與來賓會議和會員會話再次,這太複雜了)

好吧我開始漫步......但你明白了。不要讓你看到的Zend_Auth + Zend Db教程搖擺你自己的模型。他們只是簡單的例子。

這份厚禮說

0

我對這段代碼

$auth = Zend_Auth::getInstance(); 
    $identity = new stdClass(); 
    $identity->user_pk = $user->getPrimaryKey(); 
    $identity->user_name = $user->getName(); 
    $identity->role = $user->getRole(); // select * from user_role where user_pk=xxx 
    $auth->getStorage()->write($identity); 

    $identity = Zend_Auth::getInstance()->getIdentity(); 

正在user_pk,user_name和角色存儲的cookie幾個問題嗎?是否會有人使用角色名稱來訪問網站的安全部分?密碼(使用md5加密)不應該是身份驗證的一部分,因此何時可以驗證每個請求的用戶名和密碼?

+0

爲什麼這個答案實際上是一個問題? – coderama 2013-07-25 08:28:38