**[權限控制] 利用CI鉤子實現權限認證

http://codeigniter.org.cn/forums/thread-10877-1-1.htmlphp

一直沒找到CI的權限認證擴展,之前好像找到過一個老外的擴展,不過不怎麼好用,如今記不清了,後來仿着jsp firter的方式用CI鉤子寫了一下,感受還能夠,作個小網站,小應用足夠了,不必搞得太複雜。看到不少人在網上問,這裏把咱們的方法分享一下,若是你有更好的實現,也請記得分享給咱們。^_^

html

一般咱們後臺路徑看起來都會像下面這樣:

 

http://www.php-chongqing.com/index.php/manage/

 

http://www.php-chongqing.com/index.php/manage/article/add

 

http://www.php-chongqing.com/index.php/manage/product/delete/1

 

http://www.php-chongqing.com/index.php/manage/user



由於CI是MVC的,單一入口,而且給咱們提供了7個掛鉤點,一切就很簡單了,咱們只須要在CI執行目標控制器方法以前攔截到請求,檢查URI是不是以manage開頭便可,若是URI以manage開頭,就檢查用戶權限,沒有權限就跳轉到登錄頁或是相關的提示頁。



一、先到config/config.php中設置容許使用鉤子


$config['enable_hooks'] = TRUE;數據庫

二、再到config/hooks.php中配置權限認證鉤子


$hook['post_controller_constructor'] = array(    'class'    => 'ManageAuth',    'function' => 'auth',    'filename' =>'ManageAuth.php',    'filepath' => 'hooks');編程

須要注意的是必定要使用'post_controller_constructor'掛鉤點,由於咱們可能要在ManageAuth中使用CI的aip,鏈接數據庫等。



三、建立ManageAuth.php文件,放到hooks目錄下,ManageAuth.php中的代碼以下:

 

/** 後臺權限攔截鉤子 * @link http://www.php-chongqing.com * @author bing.peng *  */
class ManageAuth {
private $CI;
public function __construct()
{
$this->CI = &get_instance();
}
//權限認證
public function auth()
{
$this->CI->load->helper('url');
    if ( preg_match("/manage.*/i", uri_string()) ) {
       // 須要進行權限檢查的URL
       $this->CI->load->library('session');
       if( !$this->CI->session->userdata('username') ) {
       // 用戶未登錄
       redirect('login');
       return;
     }
    }
}

}

 



OK,就這樣,搞定了,咱們經過正則表達匹配,凡是以manage打頭的url都是須要登錄後才能訪問的。

 

示例中的權限認證很簡單,僅僅只是檢查下session是否存有username,若是有就認爲用戶已登錄,能夠訪問資源,不然就跳轉到登錄頁面。注意登錄的url千萬不是能以manage開頭,不然就重向定死循環了。



若是,你須更復雜的權限認證直接寫你本身的認證方法就OK了,好比你使用了用戶、角色、資源等等。



這種實現基本能夠算做AOP(面向切面編程)了,其實PHP已經有了AOP的雛形,改天用原生PHP的方法攔截,實現一下權限認證。^_^
相關文章
相關標籤/搜索