auth 權限控制

一. 權限介紹
所謂權限控制,大部分是在管理後臺上使用。好比超級管理員登陸,會獲得全部操做的
控制權;認證專員,只能給會員作認證操做;審覈專員,只能操做內容的審覈、刪除、加精
等操做,以此類推。那麼 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 的效果以下圖:

相關文章
相關標籤/搜索