2010-07-25 44 views
2

我目前正在使用Kohana作爲我的框架編寫幾個MVC網站。每個管理員都有一個管理員可以上傳和編輯內容的簡單管理區域。我目前存儲管理員的用戶模型中的會話,並檢查它們是否是用以下方法管理員:PHP 5 - 保護網站的管理區域

private function checkAdmin() 
{ 
    if (!isset($_SESSION['admin']) || $_SESSION['admin']->Level !== 'admin') 
    { 
     header('Location: /admin'); 
     exit; 
    } 
} 

我把這種方法在所有其他管理控制器方法,就像這樣:

public function writeReview() 
{ 
    $this->checkAdmin(); 

    // rest of the method 
} 

我只是想知道是否有什麼我可以做,以改善這一點。這看起來像是一個單一的失敗點,給我一個難聞的氣味,所以我有點疲倦,繼續下去之前繼續前進。

回答

3
  1. 只有當用戶不是管理員時,您的功能纔會重定向到/admin。如果這是預期的結果,那很好。

  2. - 忘了這個,我的錯。

  3. checkAdmin()函數,因爲它依賴於重定向,只在需要重定向的情況下才有用。例如,如果您正在處理腳本中使用它(並且您應該正在檢查它是否是處理腳本中的管理員),那麼您只需要返回true或返回false。我建議作爲基礎函數,並且重定向函數調用或替代方法接受可選參數以重定向。

+0

我現在擁有它的方式,所有的管理功能都在它自己的控制器中。它的索引()只是一個登錄表單。成功登錄設置會話變量。如果登錄失敗,或者有人試圖訪問任何控制器的公共方法,我只想將它們重定向。我認爲改變網站的家庭控制器的目的地會更好。我只是試圖儘可能地隔離管理部分。 – 2010-07-25 22:26:46

+1

['die() - 這個語言結構等同於exit().'](http://php.net/manual/en/function.die.php) – deceze 2010-07-26 03:27:49

4

如果這是Kohana版本2.x,我將移動$ this-> checkAdmin();進入你的控制器的構造函數。如果這是版本3.x,我會把它放在before()方法中。這將確保每條路線都受到保護。

1

如果您想讓用戶分享他們的登錄信息,但是否則會生成每個會話/登錄密鑰並將其存儲在數據庫中將會進一步鎖定。這樣,如果有人使用您的密碼登錄,您將被踢出,並立即知道它已被泄露。

其他基本的事情要做 - 存儲上次登錄的日期,IP ..這種東西。這不僅僅是一件事,而是很多! :)