溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

thinkPHP框架RBAC如何實現(xiàn)原理

發(fā)布時間:2021-05-18 09:44:40 來源:億速云 閱讀:203 作者:小新 欄目:開發(fā)技術

小編給大家分享一下thinkPHP框架RBAC如何實現(xiàn)原理,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

具體如下:

RBAC就是:Role Based Access Controller,基于角色(role)的權限(Access)管理,這里簡單介紹一下他的原理與實現(xiàn)方式之一。

Part 1 數(shù)據(jù)庫設計

首先最基本的組成有:用戶(admin),角色(role),具體權限(auth),這三者之間的關系是這樣的:一個用戶只擁有一種角色,一種角色下?lián)碛卸鄠€權限,一個權限也會同時被多個角色擁有,也就是說admin表和role表是一對一關系,role和auth表是多對多關系,本來符合范式設計要求的情況應該是需要一張關聯(lián)表的,但是這里為了簡單,就只把role擁有的auth寫成一個字段auth_id_lst。所以具體的表設計就是:

admin

  • admin_id

  • admin_name

  • role_id (foreign_key)

role

  • role_id

  • role_name

  • auth_id_lst

auth

  • auth_id

  • auth_name

  • auth_pid

為了更直接的理解,這里放幾個每張表的具體記錄:

auth

auth_idauth_nameauth_pid
1供應商管理0
2供應商添加1
3供應商修改1
4商品管理0
5商品下架4
6顧客管理0

role

role_idrole_nameauth_id_lst
1物流部門經(jīng)理1,2,3
2銷售部門經(jīng)理4,5
3公關部門經(jīng)理6

admin

admin_idadmin_namerole_id
1張三1
2李四2
3王五3

這樣就可以保存住具體的用戶所擁有的具體權限了,而其中為了能更好的管理具體auth,同時也為了更好的理解,所以加入了role表進行補充,如果做一個類似的話,更像下面的形式:

  • admin:具體人員

  • role:部門

  • auth:具體所需要的權限

同一個部門的人,所需要的權限基本是相同的,所以可以使用一個role進行統(tǒng)一管理。

Part 2 代碼實現(xiàn)

上面只是簡單做一個介紹,這一部分開始將介紹具體的實施方案,來自于一個帶我的大哥??炊旅娴牟糠帜阈枰邆涞闹R點有:

  • thinkphp的基礎知識

  • session的用法

這個使用的場景是一個后臺管理系統(tǒng),針對不同role開放不同的Controller(控制器)和Action(方法),所以auth表具體結(jié)構如下:

admin

  • auth_id

  • auth_name

  • auth_c 保存控制器名

  • auth_a 保存方法名

  • auth_pid 權限之間存在分類情況,使用該字段進行保存

接下來就是具體的操作步驟了:

1.1 新建Controller類

在thinkphp中每個Controller都會繼承一個thinkphp下的Think\Controller,這個時候可以新建一個Controller,之后讓所有的Controller都繼承這個新建的類,這樣所有進行的操作都要先經(jīng)過這個新建控制器的篩選。

下面是這個新建類的部分內(nèi)容:

<?php
namespace Admin\Controller;
use Think\Controller;
class FatherController extends Controller{
  // 構造函數(shù)
  public function __construct(){
    // 實例化父類構造函數(shù)
    parent::__construct();
    // session('admin_id')會在后面的驗證成功后被保存
    // session()中的?表示判斷
    fi(!session('?admin_id')){
      $this->error('必須登錄后才可以執(zhí)行操作',U('Back/login'));
    }
    // 后面還有內(nèi)容,這里先到這里
  }
}
?>

1.2 跳轉(zhuǎn)到登錄頁面

1.1中跳轉(zhuǎn)到一個登錄的頁面,在這個登錄頁面中輸入用戶名、密碼、驗證碼之后,就可以調(diào)用專門Model類來進行驗證了。這里就細講了,這里講解一下具體步驟:

  • 在BackController的login方法中實例化AdminModel類

  • 在AdminModel類中設置自動驗證和自動完成,保證用戶名和密碼都經(jīng)過驗證

  • 如果用戶名和密碼都正確,則將admin_id保存在session中,并從role表中讀取該用戶的role,與auth_id_lst,同樣保存在session中。這里做一下總結(jié):

session('admin_id') 登錄者的id

session('user_name') 登錄者注冊名

session('auth') 登錄者所擁有的role中的auth_id_lst中對應auth表的具體值,格式為 Controller/Action
session('menu') 登錄者所能操作的具體的權限信息

1.3 回到最初新建的Controller類

<?php
namespace Admin\Controller;
use Think\Controller;
class FatherController extends Controller{
  // 構造函數(shù)
  public function __construct(){
    // 實例化父類構造函數(shù)
    parent::__construct();
    // session('admin_id')會在后面的驗證成功后被保存
    // session()中的?表示判斷
    fi(!session('?admin_id')){
      $this->error('必須登錄后才可以執(zhí)行操作',U('Back/login'));
    }
    // 這里是后面新建的內(nèi)容
    // CONTROLLER_NAME 當前調(diào)用的控制器名,think的變量
    // ACTION_NAME 與CONTROLLER_NAME一樣,表示當前調(diào)用的控制器下的方法
    $currentMethod=CONTROLLER_NAME.'/'.ACTION_NAME;
    // 上面其實是thinkphp一般的pathinfo模式的url格式
    // Index隨便調(diào)用,其實就是主頁,在主頁有其他設置,用于展現(xiàn)其所擁有的權限,這個后面再看
    if(CONTROLLER_NAME=='Index'){
      return true;
    }
    // 讀取用戶所擁有的所有權限,已經(jīng)將字符串解析成數(shù)組形式了
    $allowMethod=session('auth_id_lst');
    // *表示超級用戶,擁有所有權限,如果用戶請求超越自己權限的操作,則會顯示錯誤提示頁面
    if($allowMethod!='*' && !in_array($currentMethod, $allowMethod)){
      $this->error('越權操作',U('Index/index'));
    }
  }
}
?>

1.4 主頁顯示內(nèi)容

主頁是使用thinkphp的內(nèi)置標簽自動生成的,所以只要把握好輸出的內(nèi)容,就可以限制住給于用戶的操作權限,上面說過,其中賦予用戶的操作權限都是保存在session('menu')中,所以只要在內(nèi)置標簽中調(diào)用這個值進行顯示就可以了,具體內(nèi)容就是這樣。

講的很爛我知道,畢竟只花了半個小時看其中的具體內(nèi)容,之后可能會嘗試自己寫寫看吧,那時候再說吧。

thinkphp是什么

thinkphp屬于一種免費的開發(fā)框架,能夠用于開發(fā)前端網(wǎng)頁,最早thinkphp是為了簡化開發(fā)而產(chǎn)生的,thinkphp同時也是遵循Apache2協(xié)議,最初是從Struts演變過來,也把國外一些好的框架模式進行利用,使用面向?qū)ο蟮拈_發(fā)結(jié)構,兼容了很多標簽庫等模式,它能夠更方便和快捷的開發(fā)和部署應用,當然不僅僅是企業(yè)級應用,任何php應用開發(fā)都可以從thinkphp的簡單、兼容和快速的特性中受益。

以上是“thinkPHP框架RBAC如何實現(xiàn)原理”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI