Codeigniter-實現權限認證


兩種方法

  1. 鈎子函數
  2. 集成核心Controller

方法一,鈎子函數:

一直沒找到CI的權限認證擴展,以前好像找到過一個老外的擴展,不過不怎么好用,現在記不清了,后來仿着jsp firter的方式用CI鈎子寫了一下,感覺還可以,做個小網站,小應用足夠了,沒必要搞得太復雜。看到很多人在網上問,這里把我們的方法分享一下,如果你有更好的實現,也請記得分享給我們。^_^

通常我們后台路徑看起來都會像下面這樣:

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開頭,就檢查用戶權限,沒有權限就跳轉到登陸頁或是相關的提示頁。


1、先到config/config.php中設置允許使用鈎子

$config['enable_hooks'] = TRUE;
2、再到config/hooks.php中配置權限認證鈎子

$hook['post_controller_constructor'] = array(    'class'    => 'ManageAuth',    'function' => 'auth',    'filename' => 'ManageAuth.php',    'filepath' => 'hooks');
需要注意的是一定要使用'post_controller_constructor'掛鈎點,因為我們可能要在ManageAuth中使用CI的aip,連接數據庫等。


3、創建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的方法攔截,實現一下權限認證。^_^

參考官方文檔:http://codeigniter.org.cn/user_guide/general/hooks.html

 

方法二,集成核心Controller:

<?php
class Extend_Controller extends CI_Controller {
public function __construct() {
parent::__construct();
}
}

查看官方文檔:http://codeigniter.org.cn/user_guide/general/core_classes.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM