1. 程式人生 > 實用技巧 >RBAC在PHP中的例項還算可以

RBAC在PHP中的例項還算可以

今天找了好多案例,但是都沒有發現有具體的例項。大多就是TP裡邊的簡單例子,現在我根據看到的幾篇文章對RBAC有了自己的觀點。下邊是我的心得和例子。
直白點想要做好許可權管理就首先要深層理解其含義。
我的理解就是現今流行的遊戲定義:RBAC 中有 使用者----使用者組----角色----許可權----操作
而在遊戲中有:
----玩家(這裡可以當做使用者)
----大區或區域(這裡可以看做使用者組)
----職業(這裡可以當做角色)


----技能(這裡可以當做許可權)
----技能點(可以當做操作具有的操作越多說明技能越多許可權越大)
根據這些關係我們來建表:
後臺使用者表(其中關於許可權的是 role_id 和group_id)--------這就是玩家了

DROP TABLE IF EXISTS `dh_bus_user`;

CREATE TABLE `dh_bus_user` (

`id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`bus_no` int(6) unsigned NOT NULL,

`bus_name` varchar(40) NOT NULL,

`bus_pwd` varchar(60) NOT NULL,

`bus_integral` int(8) unsigned NOT NULL DEFAULT '1000',

`bus_qq` int(12) unsigned DEFAULT NULL,

`bus_phone` varchar(13) NOT NULL,

`bus_adress` varchar(60) NOT NULL,

`bus_position_x` float(5,2) unsigned NOT NULL DEFAULT '112.32',

`bus_position_y` float(5,2) unsigned NOT NULL DEFAULT '80.55',

`bus_allow` smallint(4) unsigned NOT NULL DEFAULT '742',

`bus_level` smallint(2) unsigned NOT NULL DEFAULT '3',

`role_id` int(5) unsigned NOT NULL DEFAULT '7' COMMENT '角色ID',

`group_id` int(5) unsigned NOT NULL DEFAULT '1001' COMMENT '使用者組id',

PRIMARY KEY (`id`),

UNIQUE KEY `id` (`id`),

UNIQUE KEY `bus_no` (`bus_no`),

UNIQUE KEY `bus_name` (`bus_name`),

KEY `bus_user` (`bus_no`,`bus_name`,`bus_pwd`,`bus_phone`,`bus_adress`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;


使用者組表--------這就是大區了這個可能不是太重要,但當你的系統複雜時就需要了

DROP TABLE IF EXISTS `dh_user_group`;

CREATE TABLE `dh_user_group` (

`group_id` int(5) unsigned NOT NULL AUTO_INCREMENT,

`group_name` varchar(50) NOT NULL,

`role_id` int(5) unsigned NOT NULL,

PRIMARY KEY (`group_id`),

UNIQUE KEY `groupname` (`group_name`),

KEY `user_group` (`group_name`)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

角色表-------通過給使用者分配角色就等於 你註冊遊戲後選擇職業差不多

DROP TABLE IF EXISTS `dh_role`;

CREATE TABLE `dh_role` (

`role_id` int(10) unsigned NOT NULL AUTO_INCREMENT,

`role_name` varchar(60) NOT NULL,

PRIMARY KEY (`role_id`),

UNIQUE KEY `rolename` (`role_name`),

KEY `role` (`role_name`)

) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;


許可權表--------每一個角色會對應多個許可權(其中module_power 為 1 2 4組合的num 這樣就和Linux的許可權一樣了有多個組合)

DROP TABLE IF EXISTS `dh_access`;

CREATE TABLE `dh_access` (

`access_id` int(5) unsigned NOT NULL AUTO_INCREMENT,

`role_id` int(5) unsigned NOT NULL,

`module_id` int(5) unsigned NOT NULL,

`module_power` smallint(2) unsigned NOT NULL DEFAULT '1' COMMENT '具體許可權',

PRIMARY KEY (`access_id`)

) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

操作--------一個操作就是一個控制器 (可以看做是技能數,然後看管理員怎麼給你點技能) 其中MVC_URL 很重要這將是判斷你是否有這個技能的重要條件。

DROP TABLE IF EXISTS `dh_module`;

CREATE TABLE `dh_module` (

`module_id` int(5) unsigned NOT NULL AUTO_INCREMENT,

`module_name` varchar(60) NOT NULL,

`mvc_url` varchar(60) NOT NULL,

PRIMARY KEY (`module_id`),

UNIQUE KEY `module_name` (`module_name`),

UNIQUE KEY `mvc_url` (`mvc_url`),

KEY `module` (`module_name`,`mvc_url`)

) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;


所有表建完後新增資料如下

圖片


圖片

圖片

圖片

圖片


最後 在php中呼叫
我這裡選擇 BROPHP 的一個框架 基本就算是smarty的一個框架 所以是經典的MVC模式
在後臺的 common.php 中加入程式碼測試 程式碼如下: 【裡邊的是程式碼】


<?php
classCommonextendsAction{
functioninit(){
$_SESSION['user_id']=2;
// P($_SESSION);
// echo '<br>';
// P($_SERVER['PATH_INFO']);


$arr_pathinfo=explode('/',$_SERVER['PATH_INFO']);
$arr_pathinfo[2]=isset($arr_pathinfo[2])?$arr_pathinfo[2]:'index';
// P($arr_pathinfo);


$db_access=D("access");
$data_access=$db_access->query("SELECT dh_access.access_id, dh_role.role_name, dh_access.module_power, dh_module.module_name, dh_module.mvc_url FROM dh_access, dh_module, dh_role WHERE dh_access.role_id = '".$_SESSION['user_id']."' AND dh_access.module_id = dh_module.module_id AND dh_access.role_id = dh_role.role_id ","select");
echo'這裡';
P($data_access);

$power=false;
for($i=0;$i<count($data_access);$i++){
$mvc_url[$i]=$data_access[$i]['mvc_url'];
if($mvc_url[$i]==$arr_pathinfo['1']){
$power=true;
switch($data_access[$i]['module_power']){
case1:
$power_arr=array('index');
break;
case3:
$power_arr=array('index','add');
break;
case5:
$power_arr=array('index','del');
break;
case6:
$power_arr=array('add','del');
break;
case7:
$power_arr=array('index','add','del');
break;
default:
$power_arr=array('index');
}
if(in_array($arr_pathinfo[2],$power_arr)){
$power_action=true;
}
else{
$power_action=false;
}
}

}
if($power&&$power_action){
return true;
}
else{
$this->error(",您現在還沒有許可權操作。請升級為我們的白銀會員",2,'index/index','top');
}
}
}


其中 P 為列印方法 類同 print_r
而每個 控制器就是一個類 類裡邊都有增刪改 或者其他的 對應的 1 檢視 2 增加 修改 4 刪除 那麼就可以 根據 登入後 留下的session 中使用者的資訊提取到使用者所屬的角色 從而 判斷 許可權。我怎麼這麼聰明-----
爺是大腿 手撰 轉載 請標明 謝謝

-------爺是大腿


轉載於:https://blog.51cto.com/997823131/1834953