日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

是先设计mysql表再进行php代码_PHP与RBAC设计思路,数据表设计与源码讲解

發布時間:2023/12/10 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 是先设计mysql表再进行php代码_PHP与RBAC设计思路,数据表设计与源码讲解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

權限系統模塊對于互聯網產品是一個非常重要的功能,可以控制不同的角色合理的訪問不同的資源從而達到安全訪問的作用

權限控制有哪些模型ACL

RBAC 基于角色的訪問控制

從上圖我們可以看出,ACL是用戶和權限直接關系的,而RBAC則是通過角色間接關聯用戶和權限的。所以我們注意到角色是RBAC系統的一個重要屬性。

什么是RBAC模型

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

為什么要選擇RBAC模型

原因如下:方便用戶分組

方便權限分配和回收

擴展方便,可以滿足大部分業務需求

這些也就是我們在說權限管理前,應該先知道權限管理要有功能。

RBAC模型的關系圖

圖中有重要的RBAC模型5大屬性,分別是:

1 用戶屬性(張三、李四、王五)

2 角色屬性(銷售經理、銷售、前臺)

3 用戶與角色的關系(張三 是 銷售經理 、李四 王五 是 銷售)

4 權限(添加客戶、編輯客戶、刪除客戶,查看客戶)

5 權限與角色的關系(銷售 擁有 查看客戶的 權 限、銷售經理可以 查看/添加/刪除/編輯客戶的)

一個RBAC權限模塊,必然要實現三個功能用戶管理

用戶列表

添加用戶

編輯用戶

設置用戶角色

角色管理 角色列表

添加角色

編輯角色

設置角色權限

權限管理

權限列表

新增權限

編輯權限

如圖所示

數據表設計

用戶表

CREATE TABLE `user` (

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

`name` varchar(20) NOT NULL DEFAULT '' COMMENT '姓名',

`email` varchar(30) NOT NULL DEFAULT '' COMMENT '郵箱',

`is_admin` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否是超級管理員 1表示是 0 表示不是',

`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態 1:有效 0:無效',

`updated_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '最后一次更新時間',

`created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '插入時間',

PRIMARY KEY (`id`),

KEY `idx_email` (`email`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶表';

角色表

CREATE TABLE `role` (

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

`name` varchar(50) NOT NULL DEFAULT '' COMMENT '角色名稱',

`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態 1:有效 0:無效',

`updated_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '最后一次更新時間',

`created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '插入時間',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色表';

用戶角色表

CREATE TABLE `user_role` (

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

`uid` int(11) NOT NULL DEFAULT '0' COMMENT '用戶id',

`role_id` int(11) NOT NULL DEFAULT '0' COMMENT '角色ID',

`created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '插入時間',

PRIMARY KEY (`id`),

KEY `idx_uid` (`uid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶角色表';

權限詳情表

CREATE TABLE `access` (

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

`title` varchar(50) NOT NULL DEFAULT '' COMMENT '權限名稱',

`urls` varchar(1000) NOT NULL DEFAULT '' COMMENT 'json 數組',

`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '狀態 1:有效 0:無效',

`updated_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '最后一次更新時間',

`created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '插入時間',

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='權限詳情表';

角色權限表

CREATE TABLE `role_access` (

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

`role_id` int(11) NOT NULL DEFAULT '0' COMMENT '角色id',

`access_id` int(11) NOT NULL DEFAULT '0' COMMENT '權限id',

`created_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '插入時間',

PRIMARY KEY (`id`),

KEY `idx_role_id` (`role_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色權限表';

用戶操作記錄表

CREATE TABLE `app_access_log` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`uid` bigint(20) NOT NULL DEFAULT '0' COMMENT '品牌UID',

`target_url` varchar(255) NOT NULL DEFAULT '' COMMENT '訪問的url',

`query_params` longtext NOT NULL COMMENT 'get和post參數',

`ua` varchar(255) NOT NULL DEFAULT '' COMMENT '訪問ua',

`ip` varchar(32) NOT NULL DEFAULT '' COMMENT '訪問ip',

`note` varchar(1000) NOT NULL DEFAULT '' COMMENT 'json格式備注字段',

`created_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (`id`),

KEY `idx_uid` (`uid`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用戶操作記錄表';

代碼實現

本系統所有頁面都是需要登錄之后才能訪問的, 在框架中加入統一驗證方法

public function beforeAction($action) {

$login_status = $this->checkLoginStatus();

if ( !$login_status && !in_array( $action->uniqueId,$this->allowAllAction ) ) {

if(Yii::$app->request->isAjax){

$this->renderJSON([],"未登錄,請返回用戶中心",-302);

}else{

$this->redirect( UrlService::buildUrl("/user/login") );//返回到登錄頁面

}

return false;

}

//保存所有的訪問到數據庫當中

$get_params = $this->get( null );

$post_params = $this->post( null );

$model_log = new AppAccessLog();

$model_log->uid = $this->current_user?$this->current_user['id']:0;

$model_log->target_url = isset( $_SERVER['REQUEST_URI'] )?$_SERVER['REQUEST_URI']:'';

$model_log->query_params = json_encode( array_merge( $post_params,$get_params ) );

$model_log->ua = isset( $_SERVER['HTTP_USER_AGENT'] )?$_SERVER['HTTP_USER_AGENT']:'';

$model_log->ip = isset( $_SERVER['REMOTE_ADDR'] )?$_SERVER['REMOTE_ADDR']:'';

$model_log->created_time = date("Y-m-d H:i:s");

$model_log->save( 0 );

/**

* 判斷權限的邏輯是

* 取出當前登錄用戶的所屬角色,

* 在通過角色 取出 所屬 權限關系

* 在權限表中取出所有的權限鏈接

* 判斷當前訪問的鏈接 是否在 所擁有的權限列表中

*/

//判斷當前訪問的鏈接 是否在 所擁有的權限列表中

if( !$this->checkPrivilege( $action->getUniqueId() ) ){

$this->redirect( UrlService::buildUrl( "/error/forbidden" ) );

return false;

}

return true;

}

檢查是否有訪問指定鏈接的權限

public function checkPrivilege( $url ){

//如果是超級管理員 也不需要權限判斷

if( $this->current_user && $this->current_user['is_admin'] ){

return true;

}

//有一些頁面是不需要進行權限判斷的

if( in_array( $url,$this->ignore_url ) ){

return true;

}

return in_array( $url, $this->getRolePrivilege( ) );

}

獲取某用戶的所有權限,取出指定用戶的所屬角色, 在通過角色取出所屬權限關系,在權限表中取出所有的權限鏈接

public function getRolePrivilege($uid = 0){

if( !$uid && $this->current_user ){

$uid = $this->current_user->id;

}

if( !$this->privilege_urls ){

$role_ids = UserRole::find()->where([ 'uid' => $uid ])->select('role_id')->asArray()->column();

if( $role_ids ){

//在通過角色 取出 所屬 權限關系

$access_ids = RoleAccess::find()->where([ 'role_id' => $role_ids ])->select('access_id')->asArray()->column();

//在權限表中取出所有的權限鏈接

$list = Access::find()->where([ 'id' => $access_ids ])->all();

if( $list ){

foreach( $list as $_item ){

$tmp_urls = @json_decode( $_item['urls'],true );

$this->privilege_urls = array_merge( $this->privilege_urls,$tmp_urls );

}

}

}

}

return $this->privilege_urls ;

}

鏈接:http://www.startphp.cn/front/php/112730.html

作者:leifeng以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家

最后,祝所有大家在面試中過關斬將,拿到心儀offer。如果想與一群3-8年資深開發者一起交流學習的話,需要請戳這里?shimo.im

總結

以上是生活随笔為你收集整理的是先设计mysql表再进行php代码_PHP与RBAC设计思路,数据表设计与源码讲解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。