Thinkphp的RBAC,基於角色的許可權控制
阿新 • • 發佈:2019-01-10
可以觀看兄弟連視訊 或者網上下載資料 以下是一些檔案的記錄
RBAC中文權稱,基於角色許可權訪問控制
Role-based Access Control
Full擴充套件包。
安全攔截器
認證管理器(識別不同的身份,你的用 戶名和密碼,許可權是否在授權範圍內)
決策訪問管理器(即時模式,登陸模式)
執行身份管理(單身份,多身份管理B/S)
1,判斷當前的操作(專案【應用】,模組,動作(操作))是否需要認證
2,如果需要認證(是判斷使用者是否登陸---跳至委託認證管理器驗證身份,判斷使用者是否有許可權訪問---直接跳至無權訪問頁)
3,委託認證來驗證使用者身份
4,獲取該使用者的許可權列表
5,判斷使用者是否有許可權訪問
THINKPHP當中的RBAC難點在於,資料庫設計。而不在乎程式碼如何寫。你都可以不用寫多少程式碼。
很多人在資料庫結構,想不明白,專案【應用】,模組,動作
節點(專案 1,模組 2,方法 3)之間的關係,你先得讓使用者能訪問專案,模組,方法
(他們之間的關係,我們就叫做節點,如果說你需要將所有的節點全部可控制,
你就需要將所有的專案,專案下的模組,模組下的方法,全部加入到節點表當中去)
資料庫的建立:
-- phpMyAdmin SQL Dump -- version 3.2.2 -- http://www.phpmyadmin.net -- -- 主機: localhost -- 生成日期: 2011 年 01 月 27 日 03:26 -- 伺服器版本: 5.1.39 -- PHP 版本: 5.2.11 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; /*!40101 SET @
[email protected]@CHARACTER_SET_CLIENT */; /*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; /*!40101 SET @[email protected]@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8 */; -- -- 資料庫: `videodemo` -- -- -------------------------------------------------------- -- -- 表的結構 `think_access` -- 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, `pid` int(11) NOT NULL, KEY `groupId` (`role_id`), KEY `nodeId` (`node_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; -- -- 轉存表中的資料 `think_access` -- INSERT INTO `think_access` (`role_id`, `node_id`, `level`, `module`, `pid`) VALUES (2, 1, 1, NULL, 0), (2, 2, 2, NULL, 1), (2, 3, 2, NULL, 1), (2, 4, 3, NULL, 2), (2, 8, 3, NULL, 3), (2, 6, 3, NULL, 2); -- -------------------------------------------------------- -- -- 表的結構 `think_node` -- 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 AUTO_INCREMENT=12 ; -- -- 轉存表中的資料 `think_node` -- INSERT INTO `think_node` (`id`, `name`, `title`, `status`, `remark`, `sort`, `pid`, `level`) VALUES (1, 'admin', NULL, 1, NULL, NULL, 0, 1), (2, 'user', NULL, 1, NULL, NULL, 1, 2), (3, 'index', NULL, 1, NULL, NULL, 1, 2), (4, 'index', NULL, 1, NULL, NULL, 2, 3), (5, 'del', NULL, 1, NULL, NULL, 2, 3), (6, 'add', NULL, 1, NULL, NULL, 2, 3), (7, 'update', NULL, 1, NULL, NULL, 2, 3), (8, 'index', NULL, 1, NULL, NULL, 3, 3), (9, 'del', NULL, 1, NULL, NULL, 3, 3), (10, 'add', NULL, 1, NULL, NULL, 3, 3), (11, 'update', NULL, 1, NULL, NULL, 3, 3); -- -------------------------------------------------------- -- -- 表的結構 `think_role` -- 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 AUTO_INCREMENT=3 ; -- -- 轉存表中的資料 `think_role` -- INSERT INTO `think_role` (`id`, `name`, `pid`, `status`, `remark`) VALUES (1, 'admin', NULL, 1, NULL), (2, 'user', NULL, 1, NULL); -- -------------------------------------------------------- -- -- 表的結構 `think_role_user` -- 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_role_user` -- INSERT INTO `think_role_user` (`role_id`, `user_id`) VALUES (1, '1'), (2, '2'), (2, '3'); -- -------------------------------------------------------- -- -- 表的結構 `think_user` -- CREATE TABLE IF NOT EXISTS `think_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `password` varchar(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ; -- -- 轉存表中的資料 `think_user` -- INSERT INTO `think_user` (`id`, `username`, `password`) VALUES (1, 'admin', '21232f297a57a5a743894a0e4a801fc3'), (2, 'user', 'ee11cbb19052e40b07aac0ca060c23ee'), (3, 'liwenkai', '169d2dae41d971658519adef92b144f1');
配置檔案:
<?php
$arr=array(
'USER_AUTH_ON'=>true,
'USER_AUTH_TYPE' =>1, // 預設認證型別 1 登入認證 2 實時認證
'USER_AUTH_KEY' =>'authId', // 使用者認證SESSION標記
'ADMIN_AUTH_KEY' =>'administrator',
'USER_AUTH_MODEL' =>'User', // 預設驗證資料表模型
'AUTH_PWD_ENCODER' =>'md5', // 使用者認證密碼加密方式
'USER_AUTH_GATEWAY' =>'/Public/login', // 預設認證閘道器
'NOT_AUTH_MODULE' =>'Public', // 預設無需認證模組
'REQUIRE_AUTH_MODULE'=>'', // 預設需要認證模組
'NOT_AUTH_ACTION' =>'', // 預設無需認證操作
'REQUIRE_AUTH_ACTION'=>'', // 預設需要認證操作
'GUEST_AUTH_ON' => false, // 是否開啟遊客授權訪問
'GUEST_AUTH_ID' => 0, // 遊客的使用者ID
'RBAC_ROLE_TABLE'=>'think_role',
'RBAC_USER_TABLE' => 'think_role_user',
'RBAC_ACCESS_TABLE' => 'think_access',
'RBAC_NODE_TABLE' => 'think_node',
);
$arr1=include './config.inc.php';
return array_merge($arr1,$arr);
?>
config.inc.php內容:
<?php
return array(
'DB_TYPE'=>'mysql',
'DB_HOST'=>'localhost',
'DB_NAME'=>'videodemo', //如果資料庫名都相同的話,你可以不用定義多個
'DB_USER'=>'root',
'DB_PWD'=>'liwenkaihaha',
'DB_PORT'=>'3306',
'DB_PREFIX'=>'think_',
);
?>
admin.php
<?php
// 定義ThinkPHP框架路徑
define('THINK_PATH', './ThinkPHP/');
//定義專案名稱和路徑
define('APP_NAME', 'admin');
define('APP_PATH', './admin');
// 載入框架入口檔案
require(THINK_PATH."/ThinkPHP.php");
//例項化一個網站應用例項
App::run();
?>
lib下的ACTION CommonAction.class.php
<?php
//初使介面
class CommonAction extends Action{
function _initialize() {
// 使用者許可權檢查
if (C ( 'USER_AUTH_ON' ) && !in_array(MODULE_NAME,explode(',',C('NOT_AUTH_MODULE')))) {
import ( 'ORG.Util.RBAC' );
if (! RBAC::AccessDecision ()) {
//檢查認證識別號
if (! $_SESSION [C ( 'USER_AUTH_KEY' )]) {
//跳轉到認證閘道器
redirect ( PHP_FILE . C ( 'USER_AUTH_GATEWAY' ) );
}
// 沒有許可權 丟擲錯誤
if (C ( 'RBAC_ERROR_PAGE' )) {
// 定義許可權錯誤頁面
redirect ( C ( 'RBAC_ERROR_PAGE' ) );
} else {
if (C ( 'GUEST_AUTH_ON' )) {
$this->assign ( 'jumpUrl', PHP_FILE . C ( 'USER_AUTH_GATEWAY' ) );
}
// 提示錯誤資訊
$this->error ( L ( '_VALID_ACCESS_' ) );
}
}
}
}
}
?>
lib下的ACTION IndexAction.class.php
<?php
// 本類由系統自動生成,僅供測試用途
class IndexAction extends CommonAction{
public function index(){
echo 'index 下面的顯示';
}
function del(){
echo 'index下面的刪除';
}
function add(){
echo 'index 下面的新增';
}
function update(){
echo 'index 下面的更新';
}
}
?>
lib下的ACTION PublicAction.class.php
<?php
class PublicAction extends Action{
function index(){
$this->login();
}
function login(){
$this->display();
}
function checkLogin(){
if(empty($_POST['username'])) {
$this->error('帳號錯誤!');
}elseif (empty($_POST['password'])){
$this->error('密碼必須!');
}
//生成認證條件
$map = array();
// 支援使用繫結帳號登入
$map['username'] = $_POST['username'];
import ( 'ORG.Util.RBAC' );
$authInfo = RBAC::authenticate($map);
//使用使用者名稱、密碼和狀態的方式進行認證
if(false === $authInfo) {
$this->error('帳號不存在或已禁用!');
}else {
if($authInfo['password'] != md5($_POST['password'])) {
$this->error('密碼錯誤!');
}
$_SESSION[C('USER_AUTH_KEY')] = $authInfo['id'];
if($authInfo['username']=='admin') {
$_SESSION['administrator'] = true;
}
// 快取訪問許可權
RBAC::saveAccessList();
$this->success('登入成功!');
}
}
function loginout(){
if(isset($_SESSION[C('USER_AUTH_KEY')])) {
unset($_SESSION[C('USER_AUTH_KEY')]);
unset($_SESSION);
session_destroy();
$this->assign("jumpUrl",__URL__.'/login/');
$this->success('登出成功!');
}else {
$this->error('已經登出!');
}
}
}
?>
UserAction.class.php
<?php
class UserAction extends CommonAction{
public function index(){
echo 'user 下面的顯示';
}
function del(){
echo 'user下面的刪除';
}
function add(){
echo 'user 下面的新增';
}
function update(){
echo 'user下面的更新';
}
}
?>