thinkphp5的auth權限認證(轉自thinkphp官方文檔+本身總結)

thinkphp5的auth權限認證(轉自thinkphp官方文檔+本身總結)

1、總結

一句話總結:至關於就是用其它thinkphp的擴展同樣,都是引入擴展,配置擴展,而後使用

引入 配置 使用

基於thinkphp5的auth權限認證擴展 - ThinkPHP框架
http://www.thinkphp.cn/extend/873.htmlphp

 

一、thinkphp5的auth權限認證擴展如何安裝?

composer require
composer require 5ini99/think-auth

 

 

二、thinkphp5的auth權限認證擴展如何配置?

配置
    // auth配置
    'auth'  => [
        'auth_on'           => 1, // 權限開關
        'auth_type'         => 1, // 認證方式,1爲實時認證;2爲登陸認證。
        'auth_group'        => 'auth_group', // 用戶組數據不帶前綴表名
        'auth_group_access' => 'auth_group_access', // 用戶-用戶組關係不帶前綴表
        'auth_rule'         => 'auth_rule', // 權限規則不帶前綴表
        'auth_user'         => 'member', // 用戶信息不帶前綴表
    ],

 

 

三、thinkphp5的auth權限認證擴展如何使用?

Auth類 check()
    // 引入類庫
    use think\auth\Auth;
     
    // 獲取auth實例
    $auth = Auth::instance();
     
    // 檢測權限
    if($auth->check('show_button',1)){// 第一個參數是規則名稱,第二個參數是用戶UID
        //有顯示操做按鈕的權限
    }else{
        //沒有顯示操做按鈕的權限
    }

 

 

四、thinkphp5的auth權限認證擴展注意點?

數據表

數據表就直接複製給提供的數據表就好html

 1     think_ 爲自定義的數據表前綴
 2     -- ----------------------------
 3     -- think_auth_rule,規則表,
 4     -- id:主鍵,name:規則惟一標識, title:規則中文名稱 status 狀態:爲1正常,爲0禁用,condition:規則表達式,爲空表示存在就驗證,不爲空表示按照條件驗證
 5     -- ----------------------------
 6     DROP TABLE IF EXISTS `think_auth_rule`;
 7     CREATE TABLE `think_auth_rule` (
 8         `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
 9         `name` char(80) NOT NULL DEFAULT '',
10         `title` char(20) NOT NULL DEFAULT '',
11         `type` tinyint(1) NOT NULL DEFAULT '1',
12         `status` tinyint(1) NOT NULL DEFAULT '1',
13         `condition` char(100) NOT NULL DEFAULT '',  # 規則附件條件,知足附加條件的規則,才認爲是有效的規則
14         PRIMARY KEY (`id`),
15         UNIQUE KEY `name` (`name`)
16     ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
17     -- ----------------------------
18     -- think_auth_group 用戶組表,
19     -- id:主鍵, title:用戶組中文名稱, rules:用戶組擁有的規則id, 多個規則","隔開,status 狀態:爲1正常,爲0禁用
20     -- ----------------------------
21     DROP TABLE IF EXISTS `think_auth_group`;
22         CREATE TABLE `think_auth_group` (
23         `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
24         `title` char(100) NOT NULL DEFAULT '',
25         `status` tinyint(1) NOT NULL DEFAULT '1',
26         `rules` char(80) NOT NULL DEFAULT '',
27         PRIMARY KEY (`id`)
28     ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
29     -- ----------------------------
30     -- think_auth_group_access 用戶組明細表
31     -- uid:用戶id,group_id:用戶組id
32     -- ----------------------------
33     DROP TABLE IF EXISTS `think_auth_group_access`;
34         CREATE TABLE `think_auth_group_access` (
35         `uid` mediumint(8) unsigned NOT NULL,
36         `group_id` mediumint(8) unsigned NOT NULL,
37         UNIQUE KEY `uid_group_id` (`uid`,`group_id`),
38         KEY `uid` (`uid`),
39         KEY `group_id` (`group_id`)
40     ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

 

 

 

 

2、基於thinkphp5的auth權限認證擴展(轉)

轉自:基於thinkphp5的auth權限認證擴展 - ThinkPHP框架
http://www.thinkphp.cn/extend/873.htmlgit

 

安裝github

  1. composer require 5ini99/think-auth
複製代碼

配置
公共配置thinkphp

  1. // auth配置
  2. 'auth'  => [
  3.     'auth_on'           => 1, // 權限開關
  4.     'auth_type'         => 1, // 認證方式,1爲實時認證;2爲登陸認證。
  5.     'auth_group'        => 'auth_group', // 用戶組數據不帶前綴表名
  6.     'auth_group_access' => 'auth_group_access', // 用戶-用戶組關係不帶前綴表
  7.     'auth_rule'         => 'auth_rule', // 權限規則不帶前綴表
  8.     'auth_user'         => 'member', // 用戶信息不帶前綴表
  9. ],
複製代碼

導入數據表數據庫

  1. think_ 爲自定義的數據表前綴
  2. -- ----------------------------
  3. -- think_auth_rule,規則表,
  4. -- id:主鍵,name:規則惟一標識, title:規則中文名稱 status 狀態:爲1正常,爲0禁用,condition:規則表達式,爲空表示存在就驗證,不爲空表示按照條件驗證
  5. -- ----------------------------
  6. DROP TABLE IF EXISTS `think_auth_rule`;
  7. CREATE TABLE `think_auth_rule` (
  8.     `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  9.     `name` char(80) NOT NULL DEFAULT '',
  10.     `title` char(20) NOT NULL DEFAULT '',
  11.     `type` tinyint(1) NOT NULL DEFAULT '1',
  12.     `status` tinyint(1) NOT NULL DEFAULT '1',
  13.     `condition` char(100) NOT NULL DEFAULT '',  # 規則附件條件,知足附加條件的規則,才認爲是有效的規則
  14.     PRIMARY KEY (`id`),
  15.     UNIQUE KEY `name` (`name`)
  16. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
  17. -- ----------------------------
  18. -- think_auth_group 用戶組表,
  19. -- id:主鍵, title:用戶組中文名稱, rules:用戶組擁有的規則id 多個規則","隔開,status 狀態:爲1正常,爲0禁用
  20. -- ----------------------------
  21. DROP TABLE IF EXISTS `think_auth_group`;
  22.     CREATE TABLE `think_auth_group` (
  23.     `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  24.     `title` char(100) NOT NULL DEFAULT '',
  25.     `status` tinyint(1) NOT NULL DEFAULT '1',
  26.     `rules` char(80) NOT NULL DEFAULT '',
  27.     PRIMARY KEY (`id`)
  28. ) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
  29. -- ----------------------------
  30. -- think_auth_group_access 用戶組明細表
  31. -- uid:用戶idgroup_id:用戶組id
  32. -- ----------------------------
  33. DROP TABLE IF EXISTS `think_auth_group_access`;
  34.     CREATE TABLE `think_auth_group_access` (
  35.     `uid` mediumint(8) unsigned NOT NULL,
  36.     `group_id` mediumint(8) unsigned NOT NULL,
  37.     UNIQUE KEY `uid_group_id` (`uid`,`group_id`),
  38.     KEY `uid` (`uid`),
  39.     KEY `group_id` (`group_id`)
  40. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
複製代碼

原理

Auth權限認證是按規則進行認證。 在數據庫中咱們有

規則表(think_auth_rule)
用戶組表(think_auth_group)
用戶組明顯表(think_auth_group_access)
咱們在規則表中定義權限規則, 在用戶組表中定義每一個用戶組有哪些權限規則,在用戶組明顯表中定義用戶所屬的用戶組。

下面舉例說明:

咱們要判斷用戶是否有顯示一個操做按鈕的權限, 首先定義一個規則, 在規則表中添加一個名爲 show_button 的規則。 而後在用戶組表添加一個用戶組,定義這個用戶組有show_button 的權限規則(think_auth_group表中rules字段存得時規則ID,多個以逗號隔開), 而後在用戶組明細表定義 UID 爲1 的用戶 屬於剛纔這個的這個用戶組。

使用

判斷權限方法session

  1. // 引入類庫
  2. use think\auth\Auth;
  3.  
  4. // 獲取auth實例
  5. $auth = Auth::instance();
  6.  
  7. // 檢測權限
  8. if($auth->check('show_button',1)){// 第一個參數是規則名稱,第二個參數是用戶UID
  9.     //有顯示操做按鈕的權限
  10. }else{
  11.     //沒有顯示操做按鈕的權限
  12. }
複製代碼

Auth類也能夠對節點進行認證,咱們只要將規則名稱,定義爲節點名稱就好了。 能夠在公共控制器base中定義_initialize方法composer

  1. <?php
  2. use think\Controller;
  3. use think\auth\Auth;
  4. class Base extends Controller
  5. {
  6.     public function _initialize()
  7.     {
  8.         $controller = request()->controller();
  9.         $action = request()->action();
  10.         $auth = new Auth();
  11.         if(!$auth->check($controller . '-' . $action, session('uid'))){
  12.             $this->error('你沒有權限訪問');
  13.         }
  14.     }
  15.  }
複製代碼

這時候咱們能夠在數據庫中添加的節點規則, 格式爲: 「控制器名稱-方法名稱」

Auth 類 還能夠多個規則一塊兒認證 如:框架

  1. $auth->check('rule1,rule2',uid); 
複製代碼

表示 認證用戶只要有rule1的權限或rule2的權限,只要有一個規則的權限,認證返回結果就爲true 即認證經過。 默認多個權限的關係是 「or」 關係,也就是說多個權限中,只要有個權限經過則經過。 咱們也能夠定義爲 「and」 關係thinkphp5

  1. $auth->check('rule1,rule2',uid,'and'); 
複製代碼

第三個參數指定爲"and" 表示多個規則以and關係進行認證, 這時候多個規則同時經過認證纔有權限。只要一個規則沒有權限則就會返回false。

Auth認證,一個用戶能夠屬於多個用戶組。 好比咱們對 show_button這個規則進行認證, 用戶A 同時屬於 用戶組1 和用戶組2 兩個用戶組 , 用戶組1 沒有show_button 規則權限, 但若是用戶組2 有show_button 規則權限,則同樣會權限認證經過。

  1. $auth->getGroups(uid)
複製代碼

經過上面代碼,能夠得到用戶所屬的全部用戶組,方便咱們在網站上面顯示。

Auth類還能夠按用戶屬性進行判斷權限, 好比 按照用戶積分進行判斷, 假設咱們的用戶表 (think_members) 有字段 score 記錄了用戶積分。 我在規則表添加規則時,定義規則表的condition 字段,condition字段是規則條件,默認爲空 表示沒有附加條件,用戶組中只有規則 就經過認證。 若是定義了 condition字段,用戶組中有規則不必定能經過認證,程序還會判斷是否知足附加條件。 好比咱們添加幾條規則:

name字段:grade1 condition字段:{score}<100 
name字段:grade2 condition字段:{score}>100 and {score}<200
name字段:grade3 condition字段:{score}>200 and {score}<300
這裏 {score} 表示 think_members 表 中字段 score 的值。

那麼這時候

  1. $auth->check('grade1', uid) //是判斷用戶積分是否是0-100
  2. $auth->check('grade2', uid) //判斷用戶積分是否是在100-200
  3. $auth->check('grade3', uid) //判斷用戶積分是否是在200-300
複製代碼

請點擊頁面最上方的Download來體驗完整案例

擴展包git地址:
https://github.com/5ini99/think-auth

擴展composer地址:
https://packagist.org/packages/5ini99/think-auth


 

 

 
相關文章
相關標籤/搜索