一. 權限介紹
所謂權限控制,大部分是在管理後臺上使用。好比超級管理員登陸,會獲得全部操做的
控制權;認證專員,只能給會員作認證操做;審覈專員,只能操做內容的審覈、刪除、加精
等操做,以此類推。那麼 ThinkPHP 提供了一個內置的 Auth.class.php 類來實現權限控
制,這個類提供了三個表:think_auth_rule(認證規則表)、think_auth_group(用戶組
表)、think_auth_group_access(用戶和組對應關係表)。固然還要結合本身建立的用戶
表進行對應便可php
二. 簡單登陸
第一步:在 Admin 模塊下建立一個 IndexController.class.php (默認就有了),創
建 index 方法,輸出一句話便可。html
1 namespace Admin\Controller; 2 use Common\Controller\AuthController; 3 4 class IndexController extends AuthController { 5 public function index(){ 6 echo '後臺首頁!'; 7 } 8 }
這是經過 URL 訪問: http://localhost/demo39/Admin/Index/index ,便可訪問。sql
第二步:在 Weibo 根目錄下的 Common 公共模塊下建立 Controller 文件夾,並在裏面
建立一個 AuthController.class.php 類,這個類用於權限控制。數據庫
namespace Common\Controller; use Think\Controller; use Think\Auth; class AuthController extends Controller { protected function _initialize() { $auth = new Auth(); if(!$auth->check()) { $this->error('沒有權限'); } } }
這裏使用的方法固定爲: _initialize() 。因爲 AuthController.class.php 繼承了
Controller 類,因此,第一步的 Index 類改成繼承它。 check() 函數是調用了session
ThinkPHP/Library/Think/Auth.class.php 內部的 check() 函數。函數
1 namespace Admin\Controller; 2 use Common\Controller\AuthController; 3 class IndexController extends AuthController { 4 public function index() { 5 echo '後臺首頁!'; 6 } 7 }
此時,咱們再訪問後臺首頁的時候,已經沒有權限了。主要是 $auth->check() 驗證無
法經過的緣由。post
第三步:建立一個 WeiBo/Admin/Controller/LoginController.class.php ,模版爲 index.html 。測試
在 WeiBo/Admin/View/Login/index.html 中寫入登陸代碼:ui
1 <p>三個用戶:admin爲超級管理員,全部權限;test測試用戶,沒有權限;guest遊客,只有登陸權限。</p> 2 <form method="post" action="{:U('index')}"> 3 <p>用戶名:<input type="text" name="user" /></p> 4 <p><input type="submit" value="登陸" /></p> 5 </form>
在 WeiBo/Admin/Controller/LoginController.class.php 中寫入代碼:this
1 <?php 2 namespace Admin\Controller; 3 use Think\Controller; 4 5 class LoginCOntroller extends Controller{ 6 public function index() { 7 if(IS_POST) { 8 $login = array(); 9 switch(I('user',null,false)) { 10 case 'admin': 11 $login['uid']=1; 12 $login['user']='admin'; 13 break; 14 case 'test': 15 $login['uid']=2; 16 $login['user']='test'; 17 break; 18 case 'guest': 19 $login['uid']=3; 20 $login['user']='guest'; 21 break; 22 default: 23 $this->error('登錄用戶不存在'); 24 } 25 if(count($login)) { 26 session('auth',$login); 27 $this->success('登錄成功',U('Index/index')); 28 } 29 }else { 30 $this->display(); 31 } 32 } 33 public function logout() { 34 session('[destroy]'); 35 $this->success('退出成功',U('Login/index')); 36 } 37 }
這裏登陸的 LoginController.class.php 類只要繼承 Controller 便可,不然沒法
運行。由於繼承 AuthController 類的是須要權限控制的類。
這裏加了個 logout() 函數,就是在後臺主頁要退出的函數:
在 WeiBo/Admin/Controller/IndexController.class.php 中完善登出的功能:
1 <?php 2 3 namespace Admin\Controller; 4 use Common\Controller\AuthController; 5 6 class IndexController extends AuthController { 7 public function index(){ 8 echo '後臺首頁!'; 9 echo '<a href="'.U('Login/logout').'">退出</a>'; 10 } 11 }
第四步:完善 AuthController 類的權限驗證過程。
1 <?php 2 namespace Common\Controller; 3 use Think\Controller; 4 use Think\Auth; 5 6 class AuthController extends Controller { 7 protected function _initialize() { 8 $sess_auth=session('auth'); 9 if(!$sess_auth) { 10 $this->error('非法訪問,正在跳轉登陸頁面',U('Login/index')); 11 } 12 if($sess_auth['uid']==1) { 13 return true; 14 } 15 $auth = new Auth(); 16 if(!$auth->check( MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME,$sess_auth['uid'])) { 17 $this->error('沒有權限',U('Login/logout')); 18 } 19 } 20 }
最後的check()斷定函數中的 MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME 其實在本例子中是 Admin/Index/index ,但因爲這個權限規則可能不是固定的,因此用
MODULE_NAME.'/'.CONTROLLER_NAME.'/'.ACTION_NAME 會通用一點。
check()這個函數是調用的 ThinkPHP/Library/Think/Auth.class.php 中的,括號裏面的參數在check()函數前面的註釋裏有介紹
若是 $sess_auth['uid']==1 則斷定爲: true ,這時就不會執行下面的 !$auth->check() 函數了,這個check()函數是當不是
admin用戶時,則斷定爲沒有權限
最後再寫一些數據庫中的操做是怎樣的,
在 ThinkPHP/Library/Think/Auth.class.php 中能夠看到已經寫好了sql語句,能夠用來增長數據庫,複製後在
數據庫中粘貼就行,效果以下圖:
think_auth_rule
name是受權給用戶訪問的頁面
視頻中的權限是 Admin/Index/index
title寫的是後臺首頁
此時id默認是1,這裏id是須要認證的規則
think_auth_group
title上寫的是默認管理組
status默認是1
給rules設置爲1,可是之後仍是會設置第2,第3,第4,第5個權限,因此能夠設置爲1,2,3,4,5...,這時默認管理組就有這些權限,
這些權限就是 think_auth_rule 中的id,由於這些id對應了後面的name,name就是能夠訪問的權限 這些權限就會分配給 think_auth_group_access ,
think_auth_group_access 中的uid就是程序登陸是的 WeiBo/Admin/Controller/LoginController.class.php 中的 $login['uid'] 中的值,這裏的 group_id 就是 think_auth_group 中的id.
think_auth_rule 中的表的結構如圖:
think_auth_group 中的效果以下圖:
think_auth_group_access 的效果以下圖: