关于对RBAC的一点小改进
时间:2011-12-10
来源:互联网
- //权限认证的过滤器方法
- static public function AccessDecision($appName=APP_NAME)
- {
- //检查是否需要认证
- if(RBAC::checkAccess()) {
- //存在认证识别号,则进行进一步的访问决策
- $accessGuid = md5($appName.MODULE_NAME.ACTION_NAME);
- if(empty($_SESSION[C('ADMIN_AUTH_KEY')])) {
- if(C('USER_AUTH_TYPE')==2) {
- //加强验证和即时验证模式 更加安全 后台权限修改可以即时生效
- //通过数据库进行访问检查
- $accessList = RBAC::getAccessList($_SESSION[C('USER_AUTH_KEY')]);
- }else {
- // 如果是管理员或者当前操作已经认证过,无需再次认证
- if( $_SESSION[$accessGuid]) {
- return true;
- }
- //登录验证模式,比较登录后保存的权限访问列表
- $accessList = $_SESSION['_ACCESS_LIST'];
- }
- //判断是否为组件化模式,如果是,验证其全模块名
- $module = defined('P_MODULE_NAME')? P_MODULE_NAME : MODULE_NAME;
-
- /*
- * 若模块节点下未设置操作节点,默认为具有全部操作权限
- * 相当于仅验证至模块节点,不再继续验证操作节点
- * modify by jxxysong 2011-12-10
- */
- $db = Db::getInstance();
- $table = C('RBAC_NODE_TABLE');
- $sql = "SELECT id, name
- FROM ".$table."
- WHERE pid = (
- SELECT id
- FROM xp_node
- WHERE name = '{$module}'
- AND STATUS =1
- AND LEVEL =2 )
- AND STATUS =1
- AND LEVEL =3 ";
- $nodes = $db->query($sql);
- if (count($nodes)>0){
- $listAccess = $accessList[strtoupper($appName)][strtoupper($module)][strtoupper(ACTION_NAME)];
- }else{
- $listAccess = $accessList[strtoupper($appName)][strtoupper($module)];
- }
- /* end modify */
- if(!isset($listAccess)) {
- $_SESSION[$accessGuid] = false;
- return false;
- }
- else {
- $_SESSION[$accessGuid] = true;
- }
- }else{
- //管理员无需认证
- return true;
- }
- }
- return true;
- }
我对RBAC进行了一点小的修改,基本实现了目的,看看大家有什么斧正之处不?!
我的想法是:进行节点表的判断,如果模块(level=2)下没有操作(level=3),就只验证到模块段即可。
作者: jxxysong 发布时间: 2011-12-10
这种思路我以前实现过,的确有些系统中无需细化到操作级别,希望还有好的方法实现
作者: izyue 发布时间: 2011-12-11
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28