2012-04-07 70 views
1

這個問題特別關於如何在基於函數/ OOP/MVC的環境中正確實現會話安全。在OOP/MVC中的會話安全性

我熟悉過程文件中的會話安全性 - 如果我有一個程序化編寫的control_panel.php文件,我可以簡單地檢查頁面頂部的會話安全性,或者只要邏輯規定它是第一次加載。

但是,我是OOP/MVC的新手,我的頁面現在只是一堆功能!

希望我不需要檢查每個函數中的會話安全性..?

請注意,我正在使用CodeIgniter2。

這裏是我的代碼示例:

<?php 

class Main_controller extends CI_Controller { 

public function __construct() { 
     parent::__construct(); 
} 

public function index() { 
    //$this->load->view(my_view); 
    //run some code 
} 

public function function1() { 
    //$this->load->model(my_model); 
    // run some code 
} 

private function function2() { 
    //$this->load->view(my_view2); 
    //run some code 
} 
?> 

而且在程序PHP頁面就剛剛這個樣子:

<?php 

// check user login 
if (isset($_SESSION["user"]) && !empty($_SESSION["user"])) { 

// all of the code on the page 

} 
?> 
+0

看起來,僅在頁面頂部進行會話安全檢查並不適用。我發現,如果我去www.mysite.com/Main_controller/function1/,它只是加載function1。 – jeremy 2012-04-08 23:46:41

回答

4

將底座控制器擴展爲MY_Controller - 然後將支票放在那裏。

class MY_Controller extends CI_Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 

     if (! isset($_SESSION["user"]) OR (empty($_SESSION["user"])) 
     { 
      // User not logged in - so send them to the home page 
      redirect ("/"); 
     } 
    } 
} 

然後擴展你想「保護」,用戶將無法訪問任何人,除非他們在

class Main_controller extends MY_Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function index() 
    { 
     //$this->load->view(my_view); 
     //run some code 
    } 

    public function function1() 
    { 
     //$this->load->model(my_model); 
     // run some code 
    } 
} 

記錄在這裏看到更多信息的MY_Controller爲每個控制器: http://codeigniter.com/user_guide/general/core_classes.html

+0

請注意,MY_Controller.php不在應用程序/庫文件夾中,而是在應用程序/內核中 – Bram 2012-04-10 14:12:42

0

有本地session library in Codeigniter。還有幾個擴展庫。如果你搜索CI社區,有很多類型和例子。使會話庫自動加載形式config/autoload.php並檢查您的主控制器內部的會話驗證。

0

那麼在我看來,上述解決方案可以用於簡單的登錄驗證。如果您想根據登錄的用戶類型和其他情況來控制頁面,會發生什麼情況。從我的經驗來看,擴展基類始終是一個挑戰,而基類應該用於通用的交叉切割問題&。我建議實現一個單獨的類來處理您的驗證需求,然後在需要時調用這些類。例如,

public function function1() 
{ 
    if(SessionManager::CheckRights("IsMember")) 
    { 
     //$this->load->model(my_model); 
     // run some code 
    } 
    else 
     ...... 
}