2012-12-21 101 views
1

我試圖做一個簡單的路由規則,只允許通過身份驗證的用戶到某些控制器。在codeigniter中獲取請求的控制器鉤預控制器

爲了實現這一點,我想運行預控制器鉤子並檢查用戶是否使用ci會話登錄。但是,我必須知道用戶想要訪問哪個控制器。我如何在鉤子函數中知道這一點?

+0

使用ACL庫 - >給予角色類型的用戶 - >檢查角色類型在每一個控制器 - >只允許特定的角色 –

回答

4

$ this-> router-> fetch_class();

擴展CI_Controller,這應該工作。

3

我不認爲鉤子是最好的做法,你要在這裏實現

你可以嘗試以下內容: 您需要創建中間控制器,你會延長,而不是是CI_Controller,將有認證檢查和重定向用戶右鍵控制器

一步閱讀本教程由jondavidjohn一步創建

http://jondavidjohn.com/blog/2011/01/scalable-login-system-for-codeigniter-ion_auth

你守d能夠在10分鐘後得到想法

+0

爲什麼會被認爲是不好的做法?根據具體情況,如果一個控制器擁有許多不同認證級別的方法,那麼在路由器級別控制它將產生更簡潔的代碼。 – jjj

0

無論你只是把身份驗證放在控制器的構造函數? 它會在物品實例化時調用,您可以在那裏執行檢查。 您也可以始終擴展CI_Controller並將邏輯放在那裏,以便您可以在那裏執行檢查(並按照建議使用this-> router-> fetch_class())。

+0

這會讓你的代碼非常重複(DRY)。如果我真的想這樣做,擴展一個擴展ci_controller的額外類會更好。 – jjj

+0

Yeap,你可以創建一個新的類Secure_controller來擴展CI_Controller,並在該構造函數中添加檢查。 然後讓你想檢查的所有控制器擴展該控制器。 – tix3

+0

(回覆你編輯的答案,而不是你的第二個答覆)是的,這正是我的想法。在控制器中,有一個包含控制器和方法與身份驗證級別關係的數組。這將產生一個非常乾淨的代碼與一個地方來管理整個認證過程。當然,除非網站變得龐大 – jjj

0

如果你不想去擴展控制器路由,並且我可以在那裏看到你的邏輯,那麼你必須在這裏使用本地PHP,因爲CI對象不存在於pre_controller_hook中。

所以,得到URI,然後解析它找到控制器:

$uri = $_SERVER['REQUEST_URI']; 
$segments = explode("/", $uri); 

// if you're removing index.php from your urls, then 
$controller = $segments[0]; 

// if you're not removing index.php 
$controller = $segments[1]; 
0

在你的自動加載庫類擴展是CI_Controller。

事情是這樣的:

class MyAuthLibrary extends CI_Controller { 
    var $ci; 

    function __construct() { 

     $this->ci = &get_instance(); 
     $route = $this->ci->router->fetch_class(); 

     if(($route !== 'login') && !$this->ci->session->userdata('email_address')) { 
      redirect('login'); 
     } 
    } 

}