CakePHP學習手札 — Auth,用戶登錄管理

在開發過程中,都是使用其提供的手冊來進行學習。在CakePHP組中,他們稱之為Cook Book。第一章的實作例子就是一個簡單的部落系統,由於整個過程中都非常順利,所以我就不在這手札中提了。這裡要提的,是接下來實作演習中的用戶登錄管理作業。

先來個短短的說明:

Auth是其內建的機制,提供了三種登錄管理:Form, Basic, 和 Digest。在這裡,我使用的是最普遍使用的Form機制。簡單說就是進入一個登錄網頁,輸入你的用戶名、密碼等重要訊息,系統檢查過後就會給予其戶口關聯的使用權力。

CakePHP Cook Book中,介紹了非常直觀使用的 users/login 和 users/logout 這兩個例子。如果按照它的方法,在進入需要權力的頁面時,系統就會自動把你帶到 users/login 這個頁面,讓你進行登錄動作。退出時也只需要進入 users/logout 這個位置即可。非常簡單明確。

在學習過程中,發現一個很奇怪的情況:一旦抵達某個步驟後,就會突然間不管用什麼方法進入 users/logout 這個鏈接頁面,也不會有任何反應。儘管我從頭檢查了全部代碼和例子,都找不到真正的問題所在。結果重做了三次,最後才給我找到了答案。

管制可瀏覽頁面
登錄管理機制本身提供了一個非常簡單的頁面控制方式。只需在當前需要進行登錄限制的Controller項目中,加入下面的代碼,系統就會在某人進入這項目的頁面時,自動使用 isAuthorized( ) 功能來檢查其權限。

public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->allow(‘index’,’view’);
}

上面的例子中,不管是誰進入這個項目中的 /index 或者 /view 都沒問題。但如果進入其餘的頁面,例如 /add 就需要登錄才可以繼續瀏覽。如果項目中只有一個或少許頁面需要管制,可以把上面的例子改成限制登錄人員才能瀏覽 /admin:

public function beforeFilter() {
    parent::beforeFilter();
    $this->Auth->deny(‘admin’);
} 

登錄用戶權限管理
上面的例子只能針對是否能登錄才能瀏覽某個頁面。有時候我們需要多個用戶層次,來進行訊息管理動作。以論壇作為例子,論壇中基本用戶就分成三大類:版主、會員、遊客。其中會員和版主所擁有的權力是不一樣的,前者只能夠進行貼文、回應等動作,而版主則擁有更大的權力來管理論壇。

在CakePHP中,用戶權限層次管理也非常容易,下面例子為只有管理員可以進入用戶管理、文章刪除頁面 :

public function isAuthorized($user){
// Set default admin’s access rights
if(isset($user[‘role’]) && $user[‘role’]===’admin’) {
if(in_array($this->action,array(‘users’,’p.delete’))){
return true;
}
}

}

上面兩個管理工具,基本上配合得好的話會讓編程時,減少很多不必要的力氣來編輯這種常用的用戶管理機制。真的可以節省非常多的時間啊~

我所面對的問題
文章開頭就說到了,我在這個部份面對了一個很詭異的登錄、退出問題,一直檢查到最後才發現原來我犯的只是一個小小的邏輯性錯誤。在頁面權限管理機制中,我沒有放入 /login 和 /logout 這兩個頁面的使用權限,當只是用這一個機制,其實不會面對什麼問題的。但後面我把用戶權限管理機制加入後,由於其中沒有說明這些已經登錄的用戶可以進入 login 和 logout 頁面,所以在進入時就直接被轉移到之前的頁面,而造成不能運作的假象!

最後我在 AppController 中加入這兩個頁面的進入允許後,卡了我三天的登錄問題就這樣解決了。。。

為何把代碼加入AppController,而不是相關項目的Controller中?
任何東西加入AppController將會直接在整個系統框架中實現。既然 login 和 logout 都是公用的功能頁面,直接加入 AppController 就好了。否則就需要每個Controller項目中都需要加一個。

暫時就到此為止。繼續 coding 去~!