我試圖做一個簡單的路由規則,只允許通過身份驗證的用戶到某些控制器。在codeigniter中獲取請求的控制器鉤預控制器
爲了實現這一點,我想運行預控制器鉤子並檢查用戶是否使用ci會話登錄。但是,我必須知道用戶想要訪問哪個控制器。我如何在鉤子函數中知道這一點?
我試圖做一個簡單的路由規則,只允許通過身份驗證的用戶到某些控制器。在codeigniter中獲取請求的控制器鉤預控制器
爲了實現這一點,我想運行預控制器鉤子並檢查用戶是否使用ci會話登錄。但是,我必須知道用戶想要訪問哪個控制器。我如何在鉤子函數中知道這一點?
$ this-> router-> fetch_class();
擴展CI_Controller,這應該工作。
我不認爲鉤子是最好的做法,你要在這裏實現
你可以嘗試以下內容: 您需要創建中間控制器,你會延長,而不是是CI_Controller,將有認證檢查和重定向用戶右鍵控制器
一步閱讀本教程由jondavidjohn一步創建
http://jondavidjohn.com/blog/2011/01/scalable-login-system-for-codeigniter-ion_auth
你守d能夠在10分鐘後得到想法
爲什麼會被認爲是不好的做法?根據具體情況,如果一個控制器擁有許多不同認證級別的方法,那麼在路由器級別控制它將產生更簡潔的代碼。 – jjj
無論你只是把身份驗證放在控制器的構造函數? 它會在物品實例化時調用,您可以在那裏執行檢查。 您也可以始終擴展CI_Controller並將邏輯放在那裏,以便您可以在那裏執行檢查(並按照建議使用this-> router-> fetch_class())。
如果你不想去擴展控制器路由,並且我可以在那裏看到你的邏輯,那麼你必須在這裏使用本地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];
在你的自動加載庫類擴展是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');
}
}
}
使用ACL庫 - >給予角色類型的用戶 - >檢查角色類型在每一個控制器 - >只允許特定的角色 –