溫馨提示×

溫馨提示×

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

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

RBAC在PHP中的實(shí)例還算可以

發(fā)布時(shí)間:2020-07-13 04:36:40 來源:網(wǎng)絡(luò) 閱讀:1074 作者:飄飄留香 欄目:web開發(fā)

 今天找了好多案例,但是都沒有發(fā)現(xiàn)有具體的實(shí)例。大多就是TP里邊的簡單例子,現(xiàn)在我根據(jù)看到的幾篇文章對RBAC有了自己的觀點(diǎn)。下邊是我的心得和例子。
        直白點(diǎn)想要做好權(quán)限管理就首先要深層理解其含義。
               我的理解就是現(xiàn)今流行的游戲定義:  RBAC 中有 用戶----用戶組----角色----權(quán)限----操作
                                                    而在游戲中有: 
                                                                               ----玩家(這里可以當(dāng)做用戶)
                                                                               ----大區(qū)或區(qū)域(這里可以看做用戶組)
                                                                               ----職業(yè)(這里可以當(dāng)做角色)
                                                                               ----技能(這里可以當(dāng)做權(quán)限)
                                                                               ----技能點(diǎn)(可以當(dāng)做操作具有的操作越多說明技能越多權(quán)限越大)
            根據(jù)這些關(guān)系我們來建表:
    后臺(tái)用戶表(其中關(guān)于權(quán)限的是 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 '角色I(xiàn)D',

  `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;


    用戶組表--------這就是大區(qū)了這個(gè)可能不是太重要,但當(dāng)你的系統(tǒng)復(fù)雜時(shí)就需要了          

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;

   角色表-------通過給用戶分配角色就等于 你注冊游戲后選擇職業(yè)差不多      

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; 


    權(quán)限表--------每一個(gè)角色會(huì)對應(yīng)多個(gè)權(quán)限(其中module_power  為 1  2  4組合的num 這樣就和Linux的權(quán)限一樣了有多個(gè)組合)         

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 '具體權(quán)限',

  PRIMARY KEY (`access_id`)

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

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

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; 


        所有表建完后添加數(shù)據(jù)如下

      RBAC在PHP中的實(shí)例還算可以


RBAC在PHP中的實(shí)例還算可以

RBAC在PHP中的實(shí)例還算可以

RBAC在PHP中的實(shí)例還算可以

RBAC在PHP中的實(shí)例還算可以


最后 在php中調(diào)用
        我這里選擇 BROPHP 的一個(gè)框架  基本就算是smarty的一個(gè)框架 所以是經(jīng)典的MVC模式
在后臺(tái)的 common.php 中加入代碼測試  代碼如下: 【里邊的是代碼】


<?php
class Common extends Action {
function init(){
$_SESSION['user_id'2;
// P($_SESSION);
// echo '<br>';
// P($_SERVER['PATH_INFO']);


$arr_pathinfo explode('/',$_SERVER['PATH_INFO']);
$arr_pathinfo[2isset($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']){
case 1:
$power_arr array('index');
break;
case 3:
$power_arr array('index','add');
break;
case 5:
$power_arr array('index','del');
break;
case 6:
$power_arr array('add','del');
break;
case 7:
$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(",您現(xiàn)在還沒有權(quán)限操作。請升級(jí)為我們的白銀會(huì)員",2,'index/index','top');
}

}
     

其中 P 為打印方法 類同 print_r  
            而每個(gè) 控制器就是一個(gè)類 類里邊都有增刪改 或者其他的  對應(yīng)的 1 查看 2 增加 修改  4 刪除  那么就可以 根據(jù) 登錄后 留下的session 中用戶的信息提取到用戶所屬的角色 從而 判斷 權(quán)限。 我怎么這么聰明-----
         爺是大腿 手撰 轉(zhuǎn)載 請標(biāo)明 謝謝

                                                                                                                                                                                      -------爺是大腿


向AI問一下細(xì)節(jié)

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

AI