一. 權限介紹
所謂權限控制,大部分是在管理后臺上使用。比如超級管理員登錄,會得到所有操作的
控制權;認證專員,只能給會員做認證操作;審核專員,只能操作內容的審核、刪除、加精
等操作,以此類推。那么 ThinkPHP 提供了一個內置的 Auth.class.php 類來實現權限控
制,這個類提供了三個表:think_auth_rule(認證規則表)、think_auth_group(用戶組
表)、think_auth_group_access(用戶和組對應關系表)。當然還要結合自己創建的用戶
表進行對應即可
二. 簡單登錄
第一步:在 Admin 模塊下創建一個 IndexController.class.php (默認就有了),創
建 index 方法,輸出一句話即可。
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 ,即可訪問。
第二步:在 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() 函數是調用了
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() 驗證無
法通過的原因。
第三步:創建一個 WeiBo/Admin/Controller/LoginController.class.php ,模版為 index.html 。
在 WeiBo/Admin/View/Login/index.html 中寫入登錄代碼:
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 中寫入代碼:
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 的效果如下圖:
文章列表