文章出處

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


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()