[PHP]基于角色的访问控制RBAC
-------------------------------------------------------------------------------------------------------
RBAC(Role Based Access Control),意为基于角色的访问控制,这里用户不再拥有单独权限,而是与角色相关联,通过赋予角色权限,那么该用户也就拥有了这个角色的权限; 这里的角色可以也理解为用户组。
权限控制位置:在公共的控制器类的构造方法内,这样子类均需进行权限验证; 登录注册所在控制器可以不用继承,以CI框架为例:包含登录的控制器直接继承CI_Controller, 包含其他方法的控制器继承MY_Controller进行权限控制。
自定义的RBAC类,最终返回组装的数组格式,参考如下:
$access_list = array(
'auth'=>array(
'index'=>array(
[0]=>'index',
[1]=>'add',
),
'user'=>array(
[0]=>'index',
[1]=>'add',
[2]=>'delete',
),
),
);
三步骤 实现RBAC =>
一,需要的5张数据表如下:
用户表
角色表(用户组)
用户和角色关联表(便于存单个用户存多个角色; 否则要在用户表存roleid,多个值)
权限表(节点表:角色id,节点id,节点pid)
角色与权限关联表
(4张表实现的RABC是采用的单角色思路,可以省略掉“用户和角色关联表”,将角色id直接存入用户表,可以省掉一些代码量)
二,通过用户的id获取所有的节点权限:
1. 通过用户的id将用户的角色id查询出来,function getRoleId(){}
2. 通过用户的角色id来获取所有的节点id,function getNodeId(){}
3. 通过所有的节点id来获取节点名称,组装数组(也可存入session),function getNodes(){} function getNodeName(){}
三,验证权限:
通过$_GET['c']和$_GET['m']与$access_list['auth']中的进行对比,如果存在,拥有权限,否则无权限,进行踢出; 这里用到了函数array_key_exists()。
强调:登录退出在非公共的控制器内,不参与权限控制。
如果有使用了Ajax,那么同样可以验证,代码局部如下:
/**
|---------------------------------------------
|开启权限控制方法(以CI框架为例)
|@黑眼诗人 <www.farwish.com>
|---------------------------------------------
*/
protected function openCheck()
{
$this->load->library('rbac'); //加载rbac类
if( ! $this->rbac->access_check($id)) //rbac中access_check方法检测权限
{
if(isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest')
{
echo '您没有权限!';exit; //Ajax请求返回值
}
else
{
redirect('admin/show_notice'); //重定向至提示页
}
}
}
你还可以在上述代码中加入判断,如:超级管理员角色不受限制,这样更符合权限系统的需求。
Link: http://www.cnblogs.com/farwish/p/3886805.html
@黑眼诗人 <www.farwishcom>
[PHP]基于角色的访问控制RBAC的更多相关文章
- 移动服务和 Azure Active Directory 中基于角色的访问控制
编辑人员注释:本文章由 Matthew Henderson撰写 去年 11月,我们发布了 Azure Active Directory (AAD) 预览版作为移动服务身份提供程序.此举旨在为企业开 ...
- Azure 门户中基于角色的访问控制入门
面向安全的公司应侧重于向员工提供他们所需的确切权限. 权限过多,可能会向攻击者公开帐户. 权限太少意味着员工无法有效地完成其工作. Azure 基于角色的访问控制 (RBAC) 可通过为 Azure ...
- RBAC基于角色的访问控制
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...
- RBAC(Role-Based Access Control,基于角色的访问控制)
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...
- RBAC(Role-Based Access Control)基于角色的访问控制
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用 ...
- Azure ARM (16) 基于角色的访问控制 (Role Based Access Control, RBAC) - 使用默认的Role
<Windows Azure Platform 系列文章目录> 今天上午刚刚和客户沟通过,趁热打铁写一篇Blog. 熟悉Microsoft Azure平台的读者都知道,在老的Classic ...
- 基于角色的访问控制 (RBAC)权限管理
RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...
- 普通程序员看k8s基于角色的访问控制(RBAC)
一.知识准备 ● 上一节描述了k8s的账户管理,本文描述基于角色的访问控制 ● 网上RBAC的文章非常多,具体概念大神们也解释得很详细,本文没有站在高屋建瓴的角度去描述RBAC,而是站在一个普通程序员 ...
- PHP RBAC权限管理 基于角色的访问控制演示
RBAC rbac:Role Based Access Controll,基于角色的访问控制. 今天理一理RBAC,话不多说,直接切入主题 功能需求: 权限管理(无限极) 角色管理(可以分配权限) 管 ...
随机推荐
- 转]GSM模块信号强度CSQ与RSSI的对应关系
使用GSM或者3G模块时,都会接触到信号强度CSQ.通过指令AT+CSQ,模块返回当前的信号质量,例如: AT+CSQ +CSQ: 28,0 其中28就是信号强度CSQ,但它不是真实的CSQ,他应该叫 ...
- Ribbon Workbench The plug-in execution failed because the Sandbox Client encountered an error during initialization
使用 Ribbon Workbench打开解决方案时,出现The plug-in execution failed because the Sandbox Client encountered an ...
- [电脑知识点]Excel取消受保护视图
- html 网页生产pdf文件
在nuget中安装组件 Install-Package CPechkin https://www.nuget.org/packages/CPechkin/ 根据html生产pdf文件 using Sy ...
- Linux打开TCP BBR拥塞控制算法
要求内核为4.9以上,如果不是,请升级内核. modprobe tcp_bbr echo "tcp_bbr" >> /etc/modules-load.d/module ...
- C++ 调用 Lua
直接上代码: 1:c++代码 #include <lua.hpp> #include <LuaBridge/LuaBridge.h> #include <iostream ...
- Django的select_related 和 prefetch_related 函数优化查询
在数据库有外键的时候,使用 select_related() 和 prefetch_related() 可以很好的减少数据库请求的次数,从而提高性能.本文通过一个简单的例子详解这两个函数的作用.虽然Q ...
- Vue.js模拟百度下拉框
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Java网络通信 TCP网络,ServerSocket类
package rom; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamRe ...
- 按键显示按键编码 keycode
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...