了解來這么久權限控制權限的知識,卻不知道如何寫代碼,網上的代碼多數並沒有多少完整的源碼能提供參考。偶然看到官網的例子,現在終於也把源碼的實現也弄得明白了一點。
tp5框架的Auth類可以實現頁面的訪問權限,還可以精確到頁面上的按鈕。頁面訪問主要靠rule表的name字段。附加條件權限主要看condition字段。
源碼下載:https://files.cnblogs.com/files/mzzone/D.zip,數據庫配置在database.php.數據庫名為tp5_db.
源碼是從官網的一篇權限管理文章下的,他那里提到了對節點(路由)進行權限管理,但沒有具體源碼。又查閱了其他幾篇文章,加了一些代碼,
僅僅是實現了
1.除開放頁面,要求用戶登錄才能繼續訪問其他頁面。
2.規定哪些用戶可以訪問哪些頁面。
着重控制是訪問頁面的權限,按鈕點擊是否有效的權限官網的也有示例。
- 權限控制分為幾個情況
// 1.首先判斷是否為超級管理員
// --管理員直接放行
// --非管理員再次判斷
// 2.如果是非管理員,再次判斷訪問的節點是否在開放的數組列表中
// --節點在屬於開放權限,直接放行
// --節點不屬於開放權限,再次判斷
// 3.不屬於開放權限,判斷有沒有登錄
// --用戶已經登錄,繼續使用auth類檢查有無權限
// -----用戶有權限,直接放行
// -----用戶無權限,可以選擇不做動作,也可以讓它跳轉到首頁。
// --用戶未登錄,提示並跳轉到登錄頁面。
- Auth類實現權限控制的原理就是增加一個基礎控制器Base繼承Controller,其他需要進行權限控制的控制器繼承Base。
- Base控制器中的_initialize方法就是這個技術點的核心了。凡是繼承自Base的控制器都會優先執行這個方法。
- 這里面的過程分為幾個步驟,下面是他的代碼及其圖解。
- 源碼放到根目錄之后,將sql導入數據庫,數據庫名為tp5_db,沒有的話,先新建一個。
<?php namespace app\index\controller; use think\Request; use think\Controller; use think\auth\Auth; class Base extends Controller { public function _initialize() { //獲得當前頁面的控制器 / 方法 $request=Request::instance(); $moudle=$request->module(); //獲取當前控制器名稱 $con=$request->controller(); //獲取當前控制器名稱 $action=$request->action(); //獲取當前方法名稱 // $this->assign(array( // 'con'=>$con, // 'action'=>$action, // )); $rules=$con.'/'.$action; //組合 控制器/方法 $auth=new Auth(); //實例化auth類 $notCheck=array('Index/index','Index/login','Index/dologin','Index/logout'); //都可以訪問的頁面 if(session('uid')!=2){ //不是超級管理員才進行權限判斷 if(!in_array($rules,$notCheck)){ // 是否在開放權限里面 if(!session('uid')){ $this->error('請先登陸系統!','index/login'); } if(!$auth->check($rules,session('uid'))){ // 第一個參數 控制/方法 第二個參數:當前登陸會員的id $this->error('沒有權限','index/index'); }; } } } }
- 未登錄用戶演示過程(首頁屬於開放權限,未登錄用戶不能訪問index/addGoods節點)
- 未登錄用戶訪問addGoods
- 登錄用戶首頁
- 登錄用戶訪問addGoods,並且他是有權限訪問的。