經過一天的努力,終于把ThinkPHP的RBAC類弄明白了,現在記錄下來,成果與大家分享。要想得到更詳盡的信息,還需要去查看RBAC類的源代碼。
首先需要使用5張數據表,關系圖如下:
這五張表的英文名是任意的,只需修改相應的配置項就可以,默認的英文名分別為:用戶表(think_user)、用戶組表(think_role)、節點表(think_node)、用戶與用戶組關系表(think_role_user)、權限表(think_access)。
生成他們的sql語句如下(復制粘貼的):
~~~
CREATE TABLE IF NOT EXISTS `think_access` ( `role_id` smallint(6) unsigned NOT NULL, `node_id` smallint(6) unsigned NOT NULL, `level` tinyint(1) NOT NULL, `module` varchar(50) DEFAULT NULL, KEY `groupId` (`role_id`), KEY `nodeId` (`node_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `think_node` ( `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `title` varchar(50) DEFAULT NULL, `status` tinyint(1) DEFAULT '0', `remark` varchar(255) DEFAULT NULL, `sort` smallint(6) unsigned DEFAULT NULL, `pid` smallint(6) unsigned NOT NULL, `level` tinyint(1) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `level` (`level`), KEY `pid` (`pid`), KEY `status` (`status`), KEY `name` (`name`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `think_role` ( `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `pid` smallint(6) DEFAULT NULL, `status` tinyint(1) unsigned DEFAULT NULL, `remark` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `pid` (`pid`), KEY `status` (`status`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `think_role_user` ( `role_id` mediumint(9) unsigned DEFAULT NULL, `user_id` char(32) DEFAULT NULL, KEY `group_id` (`role_id`), KEY `user_id` (`user_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
~~~
注意其中沒有think_user表的生成語句,這張表在你編寫“用戶模型(User Model)”時自行創建,因為RBAC類不做類似于登錄時用戶名、密碼是否匹配的工作。換句話說,檢查用戶名、密碼是否匹配,該用戶能不能成功登錄的代碼是你寫的,你需要在用戶成功登錄后,將這個用戶的ID寫到相應的SESSION里,普通用戶的寫到$_SESSION[C('USER_AUTH_KEY')]里,管理員的寫到$_SESSION[C('ADMIN_AUTH_KEY')]里。
接下來要說明的是幾個相關的配置項:
~~~
// ADMIN_AUTH_KEY 管理員認證SESSION標記
// USER_AUTH_KEY 用戶認證SESSION標記
//
// $_SESSION[C('USER_AUTH_KEY')] 用來保存登陸成功后的用戶ID
// $_SESSION[C('ADMIN_AUTH_KEY')] 用來保存登陸成功后的管理員ID
//
// USER_AUTH_ON 是否需要認證
// USER_AUTH_TYPE 認證類型,1是登陸認證,2是實時認證
// USER_AUTH_MODEL 用戶模型名稱
// GUEST_AUTH_ON 是否開啟游客授權訪問
// GUEST_AUTH_ID 游客的用戶ID
//
// REQUIRE_AUTH_MODULE 需要認證模塊(若定義了,則只驗證給出的模塊;否則驗證所有模塊)
// NOT_AUTH_MODULE 無需認證模塊(若定義了“需要認證模塊”則本條定義無效)
// REQUIRE_AUTH_ACTION 需要認證操作(若定義了,則只驗證給出的操作;否則驗證所有操作)
// NOT_AUTH_ACTION 無需認證操作(若定義了“需要認證操作”則本條定義無效)
//
// USER_AUTH_GATEWAY 認證網關,如果用戶沒有登錄則轉到這頁(URL路由規則)
// RBAC_DB_DSN 數據庫連接DSN
// RBAC_ROLE_TABLE 角色表名稱
// RBAC_USER_TABLE 用戶表名稱(應該是用戶、用戶組關系表)
// RBAC_ACCESS_TABLE 權限表名稱
// RBAC_NODE_TABLE 節點表名稱
~~~
在定義了這幾項之后,就可以調用RBAC類中的方法了,這些方法的聲明及解釋如下:
1.
`static public function authenticate($map,$model='')`
根據map中指定的條件查詢“用戶模型”,返回符合條件的數據。其實就是M(User)->where($map)->find()。
2.
static function saveAccessList($authId=null)
檢測當前用戶的所有權限,并將這些擁有的權限保存在$_SESSION['_ACCESS_LIST']中,不返回任何東西。開銷很大,是對RBAC::getAccessList的默認參數封裝。
3.
`static function getRecordAccessList($authId=null,$module='')`
檢測當前用戶在當前模塊中所擁有的權限,并將這些權限返回。開銷很大,是對getModuleAccessList的默認參數封裝。
4.
`static function checkAccess()`
檢查當前操作是否需要認證,需要認證則返回true,不需要則返回false.
5.
static public function checkLogin()
檢查用戶是否登錄。如果沒有登錄,則嘗試進行“游客”登錄;如果沒有開啟以游客身份登錄,則跳轉到認證網關。登錄成功將返回true。
6.
`static public function AccessDecision($appName=APP_NAME)`
權限認證的過濾器方法,檢查當前操作是否被允許,返回bool值。
7.
`static public function getAccessList($authId)`
取得指定用戶的權限列表。
8.
`static public function getModuleAccessList($authId,$module)`
取得指定用戶、指定模塊的權限列表。
- 前端工程師
- HTML
- 使用meta實現頁面的定時刷新或跳轉
- 表單相關
- 表單元素input、按鈕、文字完美垂直居中對齊方法
- CSS
- 相關工具網站
- JS
- jQuery
- 第1章 初始jQuery
- 環境搭建
- jQuery對象與DOM對象
- jQuery對象轉化成DOM對象
- DOM對象轉化成jQuery對象
- 第2章 jQuery選擇器
- id選擇器
- 類選擇器
- 元素選擇器
- 全選擇器(*選擇器)
- 層級選擇器
- 基本篩選選擇器
- 內容篩選選擇器
- 可見性篩選選擇器
- 屬性篩選選擇器
- 子元素篩選選擇器
- 表單元素選擇器
- 表單對象屬性篩選選擇器
- 特殊選擇器this
- 第3章 jQuery的屬性與樣式
- 元素的數據存儲
- 問題解決方案
- 解決innerHTML包含的js代碼不能被執行的問題
- webpackdoc
- 前端開發框架
- Bootstrap 3.3.6
- 起步
- 全局 CSS 樣式
- 概覽
- 柵格系統
- PHP
- PHP入門篇
- 基礎總結
- PHP環境變量$_SERVER和系統常量詳細說明
- PHP進階篇
- 數組
- 函數
- 類
- 字符串操作
- 正則表達式
- 會話控制
- 文件系統
- 日期和時間
- 圖形圖像操作
- PHP異常處理
- 數據庫操作
- WEB在線文件管理器
- PHP文件操作
- 獲取首層目錄信息
- 獲取文件信息
- 列表顯示文件及大小
- PHP與MySQL關系大揭秘
- PHP支持哪些數據庫
- 數據庫擴展
- 連接MySQL數據庫
- 執行MySQL查詢
- 插入新數據到MySQL中
- MVC架構模式分析與設計
- Smarty模版語法
- Smarty的基本語法
- Smarty的條件判斷語句
- Smarty的循環語句
- Smarty的文件引用
- Smarty類和對象賦值與使用
- Smarty函數的使用
- functions函數插件的定義和使用
- modifiers變量調節器插件的定義和使用
- block functions區塊函數插件的定義和使用
- Smarty實例
- MVC微型框架的建立
- 網絡摘抄
- PHPExcel如何讀取超大excel文件
- Composer
- Composer技巧
- PHP 開發者該知道的 5 個 Composer 小技巧
- composer常用命令
- Composer使用方法整理(Cy23)
- 利用Composer一步一步搭建自己的PHP框架
- ThinkPHP
- ThinkPHP中RBAC類詳解(一)
- 附:添加注釋版RBAC類源碼
- 常見問題
- 常見方法
- thinkphp 合并兩個字段組合成一個臨時字段concat函數
- ThinkPHP Where 條件中使用表達式
- 編程相關工具
- Eclipse
- Eclipse或Zendstudio漢化
- Zend studio
- Zendstudio快捷鍵
- Zend Studio實用快捷鍵一覽表
- Sublime text
- Sublime text快捷鍵
- 16 個 Sublime Text 快捷鍵
- Emmet的用法及相關語法
- VS Code
- 數據庫
- MySql
- 問題匯總
- mysql創建存儲過程失敗1307錯誤解決
- Mysql出現Field * doesn't have a default value解決辦法
- mysql:ADO連接mysql數據庫,驅動程序和ODBC數據源問題
- 自己如何正確獲取MYSQL的ADO連接字符串
- 網上摘抄
- mysql 存在更新 不存在插入
- Mysql字符串字段中是否包含某個字符串,用 find_in_set
- mysql字段類型對應的數字編號
- 5.7mysql group分組查詢錯誤問題
- mysql常用操作語句
- SQL2005
- SQL常見錯誤
- 使用 sp_change_users_login 修復產生的孤 立賬戶 & 還原中的孤立用戶
- ASP
- Url編碼解碼函數合集 含utf-8和gb2312
- 其他前端相關技巧
- 聯機查看 Office 文檔
- 服務器配置
- windows
- 服務器安裝
- XAMPP自帶TOMCAT插件可以支持php+java
- IIS
- iis7服務器,客戶端無法下載exe文件的解決之道
- Linux
- ubuntu
- Linux安裝JDK
- 輔助開發工具
- Git