1. 程式人生 > >RBAC許可權控制【TP3.2實現】

RBAC許可權控制【TP3.2實現】

1---引入

RBAC(Role-Based Access Control,基於角色的訪問控制),就是使用者通過角色許可權進行關聯。簡單地說,一個使用者擁有多個角色,每一個角色擁有多個許可權。這樣,就構造成“使用者-角色-許可權”的授權模型。在這種模型中,使用者與角色之間,角色與許可權之間,一般者是多對多的關係。

2---RBAC模型設計


3---實現方法

3-1方法一

1.通過登入獲取使用者ID,通過使用者ID獲取使用者角色ID組
2.通過獲取當前許可權(控制器名/方法名)得到許可權對應的ID,通過許可權ID獲取擁有該許可權的角色ID組
3.通過函式array_intersect()獲取第一步 和 第二步 的公共部分

3-2方法二

1.通過登入獲取使用者ID,通過使用者ID獲取使用者角色ID組(使用者角色表)
2.通過使用者角色獲取角色擁有的許可權(角色許可權表)
3.查詢許可權中是否擁有當前訪問許可權

4---RBAC原始碼

[此處使用方法一實現]
<?php
namespace Admin\Controller;
use Think\Controller;
class ComController extends Controller {
    // 檢測非法登入
    public function __construct()
    {
    	parent::__construct();
    	if(!session('uid')){
    		$this->error('請登入',U('Login/login'),2);
    	}
    	// 調取檢測許可權方法
    	$comRole = $this->checkPower();
    	if($comRole == NULL){
    		$this->error('請向管理員申請許可權');
    	}
    }
    // 檢測許可權
    public function checkPower()
    {
    	// 獲取當前使用者的ID
    	$adminId = session('uid');
    	// 獲取當前使用者對應的角色
    	$roleIdList = M('AdminRole')->where(array('admin_id'=>$adminId))->getField('rid',true);
    	// 獲取當前 控制器 和 方法 【拼接】
    	$power = CONTROLLER_NAME.'/'.ACTION_NAME;
        //設定首頁所有登入使用者可訪問
        if($power == "Index/index"){
            return 1;
        }
    	// 查詢當前(控制器/方法)對應的許可權的ID
    	$power_id = M('Power')->where(array('power_url'=>$power))->getField('power_id');
    	// 查詢當前許可權對應的所有角色
    	$roleId = M('RolePower')->where(array('pid'=>$power_id))->getField('rid',true);
 		// 檢測是否有公共項
 		$roles = array_intersect($roleIdList, $roleId);
 		return $roles;
    }
   
}
?>

[說明]

array_intersect ---- 計算陣列的交集
array_ intersect ( array $array1 , array $array2 [, array $ ... ] )

5---RBAC總結

5-1表詳情

shop_admin  //使用者表
shop_role   //角色表
shop_power  //許可權表(控制器名/方法名)
shop_admin_role  //使用者角色表
shop_role_power  //角色許可權表

5-2表設計

CREATE TABLE `shop_admin` (
  `admin_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `admin_name` varchar(20) DEFAULT NULL,
  `admin_pwd` varchar(50) DEFAULT NULL,
  `last_time` int(20) DEFAULT NULL,
  `error_time` int(10) NOT NULL DEFAULT '0',
  PRIMARY KEY (`admin_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

CREATE TABLE `shop_role` (
  `role_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `role_name` varchar(20) NOT NULL,
  `role_status` int(10) NOT NULL DEFAULT '1' COMMENT '啟用狀態\r\n   啟用 1(預設)  \r\n停用 0\r\n\r\n',
  PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

CREATE TABLE `shop_power` (
  `power_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `power_name` varchar(255) DEFAULT NULL,
  `power_url` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`power_id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;

CREATE TABLE `shop_admin_role` (
  `a_r_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `aid` int(10) NOT NULL,
  `rid` int(10) NOT NULL,
  PRIMARY KEY (`a_r_id`)
) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8;

CREATE TABLE `shop_role_power` (
  `r_p_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `rid` int(10) DEFAULT NULL,
  `pid` int(10) DEFAULT NULL,
  PRIMARY KEY (`r_p_id`)
) ENGINE=InnoDB AUTO_INCREMENT=87 DEFAULT CHARSET=utf8;

RBAC總結完畢!!!奮鬥奮鬥奮鬥

相關推薦

RBAC許可權控制TP3.2實現

1---引入 RBAC(Role-Based Access Control,基於角色的訪問控制),就是使用者通過角色與許可權進行關聯。簡單地說,一個使用者擁有多個角色,每一個角色擁有多個許可權。這樣,

TP3.2.3微信網頁授權--基類

重新 exec 進入 index.php sset AR 關註 fun func 非常好用的微信授權 基類:其他的微信權限類都可以繼承至該類: <?php namespace Wechat\Controller; use Think\Controller;

TP3.2TP3.2實現ajax分頁(原創+親測可用)

條件 func edit syn model 多條 ade ges var 一,寫在最開始:ajax分頁的原理,是利用了js的ajax執行請求,獲取分頁list和分頁page 【代碼塊】,去替換頁面顯示數據的【代碼塊】 技術:js的ajax + TP3.2的fet

WPF許可權控制——2模組、選單、按鈕

  週末沒有工作,沒有寫部落格,因為覺得休息很必要;曾聽到一句話是這樣說的:“你們得救在乎歸回安息;你們得力在乎平靜安穩”。當我想到太陽沒秒鐘要燃燒420萬噸的燃料時,想到的就是造物主的厚愛與自己的渺小,如果一直忙碌下去,一直覺得自己很了不起,地球缺了我就不轉了,那我真的是沒救了!   這

TP3.2詳解_initialize() 和 __construct() 的區別和聯系

instance ins 執行 構造方法 ces 實例化 direct control 初始化 1、假設 一個AdminController.class.php 集成至 \Think\Controller 類, 我們來看看Controller.class.php的構造方法源

TP3.2.*解決session過期不失效 和 設置不成功問題

lifetime runtime isset 清除 不成功 use 問題 func true 1、背景:本來我想設置session有效期1800秒即30分鐘 失效的,可是實際使用TP3.2.0的時候發現,登錄了幾天用戶竟然沒有失效,一直都可以登錄。 2、解決: 2.1

TP3.2模板 select選項采坑

sel bsp item code selected 圖片 http sele 模板 1、TP3.2 模板 select 下拉框采坑 <div class="form-item"> <label class="item-labe

Vue 前端應用實現RBAC許可權控制的一種方式

許可權控制不管前後端都可以簡單分為: 身份認證許可權控制 RBAC許可權控制 ... 而前端我和團隊,檢索了很多地方都沒有很成熟或者說可行的關於 RBAC基於角色的訪問控制相關的前端許可權控制方案,可能是我們檢索的方法不對,亦或是大家都忙於其他,沒有時間把自己的方法整理公佈出來,故我們在

Swift 2.0實現簡單彈幕功能

前言   簡單實現彈幕功能,表跟我談效率,但也有用佇列控制同時彈的數量。 宣告   歡迎轉載,但請保留文章原始出處:)   部落格園:http://www.cnblogs.com  農民伯伯: http://over140.cnblogs.com 正文 let DANMAKU_

2實現Singleton模式

【題2實現Singleton模式】 【題目】 設計一個類,我們只能生成該類的一個例項(單例設計模式) 【思路】 不好的解法: 1.只適用於單執行緒環境 2.雖然再多執行緒環境中能工作但效率不高 可行的解法: 加同步鎖前後2次判斷例項是否已存在 強烈推薦解法: 1.利用靜態建構函式 2.實

yii2搭建完美后臺並實現rbac許可權控制案例--之左側選單子級無法高亮的問題

新增角色是屬於角色這個選單的,如何在執行新增角色這個操作時讓角色這個選單處於選中狀態呢?adminlte左側導航的Create,View等action不能定位到index的模組(左側二級導航不能展開定位)如果你是按照我們上文的教程來的,那接下來所要說明的問題應該不是問題,先

Thinking in Java 第6章 訪問許可權控制 包:庫單元

//宣告:部分內容引自《Java程式設計思想(第四版)》機械工業出版社 – 當編寫一個 Java 原始碼檔案時,此檔案通常被稱為編譯單元(有時也被稱為轉譯單元)。每個編譯單元都有一個字尾名 .java。 – 當編譯一個 .java 檔案時,在 Java 檔案

Android介面實現資訊更新小紅點顯示——自定義控制元件BadgeView的使用介紹

在現在大部分的資訊釋出類應用,都有這樣的一個功能:當後臺資料更新,比如有系統訊息或者是使用者間有互動的時候,通過在控制元件上顯示一個小紅點來提示使用者有新的資訊。一般來說,這種業務需求,我們可以在佈局檔案中隱藏一個小紅點,然後當檢測到有資料更新的時候,我們將隱藏的小紅點顯示

yii2搭建完美后臺並實現rbac許可權控制例項教程

1、安裝yii2 已安裝的請繼續看下一步操作 2、配置資料庫 2.1 配置資料庫 修改common/config/main-local.php 實際專案中本地的資料庫往往跟線上資料庫不一致, 我們這裡配置到main-local.php就可以了,產品上線後,我們

Yii2搭建後臺並實現rbac許可權控制完整例項教程

1、安裝yii2 未安裝的請參考yii2史上最簡單式安裝教程,沒有之一 已安裝的請繼續看下一步操作 2、配置資料庫 2.1 配置資料庫 修改common/config/main-local.php 實際專案中本地的資料庫往往跟線上資料庫不一致, 我們這裡配置到main-local.php就可以了,產品上線後

Yii2 rbac許可權控制之Rule實現及應用詳解

對於一般的許可權系統而言,我們之前做的rbac一般情況下是足夠的,即時沒有rule,相信你也能實現我們用rule實現的功能。 我們就以官網的例子給出一個具體的操作教程,看看這個神祕的rule到底是做什麼的! 看需求: 我們有管理員和普通使用者,對於文章系統而言,我們允許

奇思妙想,如何給閘道器設計一款專屬的許可權控制責任鏈設計模式

什麼是責任鏈模式 客戶端發出一個請求,鏈上的物件都有機會來處理這一請求,而客戶端不需要知道誰是具體的處理物件。這樣就實現了請求者

WPF許可權控制——1介面佈局

  本來就不怎麼喜歡寫部落格,好不容易申請了部落格園的賬號,邁出了先前沒有跨越的第一步;轉眼間幾年的時間就過去了,還是空空如也。今天的心境是這樣的,發現wpf相關的資料及原始碼實在不多,就想寫下隨筆;一方面是自己在學習中做下記錄,另一方面也可以給後來者提供些參考。加利利海與鹽海最大的區別就是,前者有

WPF許可權控制——3資料庫、自定義彈窗、表單驗證

    你相信“物競天擇,適者生存”這樣的學說嗎?但是我們今天卻在提倡“尊老愛幼,救死扶傷”,幫助並救護弱勢群體;第二次世界大戰期間,希特勒認為自己是優等民族,劣勢民族應該被消滅,這樣的思想帶來的戰爭之痛,至今讓人難以忘懷。我們的文化裡面有這樣一句話“天無絕人之路”,在西方世界是“神愛世人

Luogu關卡2-1簡單的模擬(2017年10月)

題意 pan 任務 進制 class spa -s row 機器翻譯 任務說明:開始普及組的訓練!所謂模擬,就是直接根據題意編寫,思維難度簡單。 鋪地毯 進制轉換 多項式輸出 機器翻譯 排座椅 笨小猴 都是簡單模擬題 【Luogu】【關卡2-1】簡單