文档章节

ThinkPHP 3.0 + Rbac 应用示例

王昊然
 王昊然
发布于 2012/10/16 10:34
字数 923
阅读 6621
收藏 20

      此为Rbac在ThinkPHP中应用的实例,用到了ThinkPHP的Rbac扩展,样式比较难看,大家将就的看。此例子旨在学习交流使用,勿用于实际项目中。

      Rbac简单说来就是基于“角色”的权限控制,所有用户都属于某一用户组,之后给用户组授权,则组内成员都有相应权限。而ThinkPHP的Rbac的核心,即为在每个操作前都进行权限验证操作,用_initialize方法实现。而权限位则在登录时写到session中,如果对权限的实时性要求非常高,也可以设置每一次验证都到数据库里查。

      程序源码:

      http://vdisk.weibo.com/s/fOMnN

     相关配置项:

'USER_AUTH_ON' => true,//开启验证
  'USER_AUTH_TYPE' => 1,//验证类型
  'USER_AUTH_KEY' => 'uid',
  // REQUIRE_AUTH_MODULE  需要认证模块,不设置即为除了NOT_AUTH_MODULE中的模块外全部验证
  'NOT_AUTH_MODULE' => 'Public',
  'USER_AUTH_GATEWAY' => '/Public/login', //认证网关
  // RBAC_DB_DSN  数据库连接DSN,默认使用配置文件
  'RBAC_ROLE_TABLE' => 'think_role', //角色表名称
  'RBAC_USER_TABLE' => 'think_role_user', //用户表名称
  'RBAC_ACCESS_TABLE' => 'think_access', //权限表名称
  'RBAC_NODE_TABLE' => 'think_node', //节点表名称
  'USER_AUTH_MODEL' => 'User',
  'AUTH_PWD_ENCODER' => 'md5',
  'GUEST_AUTH_ON' => false,
  'ADMIN_AUTH_KEY' => 'administrator',//管理员标识

     认证方法:

public function _initialize(){
     // 用户权限检查
        if (C('USER_AUTH_ON') && !in_array(MODULE_NAME, explode(',', C('NOT_AUTH_MODULE')))) {
            import('ORG.Util.RBAC');
            if (!RBAC::AccessDecision()) {
                //检查认证识别号
                if (!$_SESSION [C('USER_AUTH_KEY')]) {
                    //跳转到认证网关
                    redirect(PHP_FILE . C('USER_AUTH_GATEWAY'));
                }
                // 没有权限 抛出错误
                if (C('RBAC_ERROR_PAGE')) {
                    // 定义权限错误页面
                    redirect(C('RBAC_ERROR_PAGE'));
                } else {
                    if (C('GUEST_AUTH_ON')) {
                        $this->assign('jumpUrl', PHP_FILE . C('USER_AUTH_GATEWAY'));
                    }
                    // 提示错误信息
                    $this->error(L('_VALID_ACCESS_'));
                }
            }
        }
  }

     程序截图如下:

SQL:

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `think_access`
-- ----------------------------
DROP TABLE IF EXISTS `think_access`;
CREATE TABLE `think_access` (
  `role_id` smallint(6) unsigned NOT NULL,
  `node_id` smallint(6) unsigned NOT NULL,
  `pid` smallint(6) NOT NULL DEFAULT '0',
  `level` tinyint(1) NOT NULL,
  `module` varchar(50) DEFAULT NULL,
  KEY `groupId` (`role_id`),
  KEY `nodeId` (`node_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of think_access
-- ----------------------------
INSERT INTO `think_access` VALUES ('62', '112', '103', '3', null);
INSERT INTO `think_access` VALUES ('62', '109', '103', '3', null);
INSERT INTO `think_access` VALUES ('62', '108', '103', '3', null);
INSERT INTO `think_access` VALUES ('62', '107', '103', '3', null);
INSERT INTO `think_access` VALUES ('62', '106', '103', '3', null);
INSERT INTO `think_access` VALUES ('62', '105', '103', '3', null);
INSERT INTO `think_access` VALUES ('62', '104', '103', '3', null);
INSERT INTO `think_access` VALUES ('62', '103', '102', '2', null);
INSERT INTO `think_access` VALUES ('62', '102', '0', '1', null);

-- ----------------------------
-- Table structure for `think_node`
-- ----------------------------
DROP TABLE IF EXISTS `think_node`;
CREATE TABLE `think_node` (
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `title` varchar(50) DEFAULT NULL,
  `status` tinyint(1) DEFAULT '0',
  `remark` varchar(255) DEFAULT NULL,
  `sort` smallint(6) unsigned DEFAULT NULL,
  `pid` smallint(6) unsigned NOT NULL,
  `level` tinyint(1) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `level` (`level`),
  KEY `pid` (`pid`),
  KEY `status` (`status`),
  KEY `name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=113 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of think_node
-- ----------------------------
INSERT INTO `think_node` VALUES ('102', 'Index', '首页', '1', '', '0', '0', '1');
INSERT INTO `think_node` VALUES ('103', 'Index', '首页模块', '1', '', '0', '102', '2');
INSERT INTO `think_node` VALUES ('104', 'index', '首页', '1', '', '0', '103', '3');
INSERT INTO `think_node` VALUES ('105', 'left', '左侧模板', '1', '', '0', '103', '3');
INSERT INTO `think_node` VALUES ('106', 'main', '右侧模板', '1', '', '0', '103', '3');
INSERT INTO `think_node` VALUES ('107', 'header', '头部模板', '1', '', '0', '103', '3');
INSERT INTO `think_node` VALUES ('108', 'add', '用户管理', '1', '', '0', '103', '3');
INSERT INTO `think_node` VALUES ('109', 'addUser', '新增用户', '1', '', '0', '103', '3');
INSERT INTO `think_node` VALUES ('112', 'ajaxuser', '获取用户组', '1', '', '0', '103', '3');

-- ----------------------------
-- Table structure for `think_role`
-- ----------------------------
DROP TABLE IF EXISTS `think_role`;
CREATE TABLE `think_role` (
  `id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `pid` smallint(6) DEFAULT NULL,
  `status` tinyint(1) unsigned DEFAULT NULL,
  `remark` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `pid` (`pid`),
  KEY `status` (`status`)
) ENGINE=MyISAM AUTO_INCREMENT=63 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of think_role
-- ----------------------------
INSERT INTO `think_role` VALUES ('62', '用户管理组', '0', '1', '这是用户管理组,只能新增用户');

-- ----------------------------
-- Table structure for `think_role_user`
-- ----------------------------
DROP TABLE IF EXISTS `think_role_user`;
CREATE TABLE `think_role_user` (
  `role_id` mediumint(9) unsigned DEFAULT NULL,
  `user_id` char(32) DEFAULT NULL,
  KEY `group_id` (`role_id`),
  KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of think_role_user
-- ----------------------------
INSERT INTO `think_role_user` VALUES ('62', '112');

-- ----------------------------
-- Table structure for `think_user`
-- ----------------------------
DROP TABLE IF EXISTS `think_user`;
CREATE TABLE `think_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `password` char(32) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=122 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of think_user
-- ----------------------------
INSERT INTO `think_user` VALUES ('2', 'admin', '21232f297a57a5a743894a0e4a801fc3');
INSERT INTO `think_user` VALUES ('112', 'test', '098f6bcd4621d373cade4e832627b4f6');

欢迎交流讨论

© 著作权归作者所有

王昊然
粉丝 28
博文 5
码字总数 20267
作品 0
海淀
程序员
私信 提问
加载中

评论(8)

王昊然
王昊然 博主

引用来自“言会咸”的评论

不知楼主能否在分享一下源码,之前的源码连接已经失效
不好意思,时间太长了,找不到了.
言会咸
言会咸
不知楼主能否在分享一下源码,之前的源码连接已经失效
王昊然
王昊然 博主

引用来自“墨龙”的评论

引用来自“王昊然”的评论

引用来自“墨龙”的评论

引用来自“王昊然”的评论

引用来自“墨龙”的评论

这个只控制到控制器,那小的地方怎么控制呢?

可控制:应用、模块和方法

好吧,等于没有说
我的意思是这样的上面的控制方法是这样的(APP/MODEL/ACTION),我要的是控制到Action里面的小块地方

分出来写成方法不好么?

好吧,比如说,我访问这个页面的时候,大部分页面我是能看到的,只是该页面的列表处显示“你无此权限”,因为大部分内容是可以看的啊,如果只控制到ACTION的话就只能是整个页面我都看不到,现在明白了不?

这样的话,也可以添加相应的节点和权限,只是在方法内部,手动验证下吧
墨龙
墨龙

引用来自“王昊然”的评论

引用来自“墨龙”的评论

引用来自“王昊然”的评论

引用来自“墨龙”的评论

这个只控制到控制器,那小的地方怎么控制呢?

可控制:应用、模块和方法

好吧,等于没有说
我的意思是这样的上面的控制方法是这样的(APP/MODEL/ACTION),我要的是控制到Action里面的小块地方

分出来写成方法不好么?

好吧,比如说,我访问这个页面的时候,大部分页面我是能看到的,只是该页面的列表处显示“你无此权限”,因为大部分内容是可以看的啊,如果只控制到ACTION的话就只能是整个页面我都看不到,现在明白了不?
王昊然
王昊然 博主

引用来自“墨龙”的评论

引用来自“王昊然”的评论

引用来自“墨龙”的评论

这个只控制到控制器,那小的地方怎么控制呢?

可控制:应用、模块和方法

好吧,等于没有说
我的意思是这样的上面的控制方法是这样的(APP/MODEL/ACTION),我要的是控制到Action里面的小块地方

分出来写成方法不好么?
墨龙
墨龙

引用来自“王昊然”的评论

引用来自“墨龙”的评论

这个只控制到控制器,那小的地方怎么控制呢?

可控制:应用、模块和方法

好吧,等于没有说
我的意思是这样的上面的控制方法是这样的(APP/MODEL/ACTION),我要的是控制到Action里面的小块地方
王昊然
王昊然 博主

引用来自“墨龙”的评论

这个只控制到控制器,那小的地方怎么控制呢?

可控制:应用、模块和方法
墨龙
墨龙
这个只控制到控制器,那小的地方怎么控制呢?
OSChina 第 11 期高手问答,主题:ThinkPHP

ThinkPHP 是一个开源的、快速、简单的面向对象的轻量级PHP开发框架,遵循Apache开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计...

红薯
2012/03/10
8.4K
50
ThinkPHP 2.0 版本正式发布

在经过5个月的重构和完善之后,ThinkPHP终 于发布了新的里程碑版本2.0,作为新版网站上线和祖国60周年华诞的献礼,我们送给大家这样一份惊喜。感谢为了新版的功能辛苦测试和完善的朋友们,感...

红薯
2009/10/16
1K
2
RBAC示例

thinkphp RBAC示例 包

zhangyicheng
2011/04/04
489
0
php 我要上班

会的技术: PHP:能熟练使用PHP开发网站,会使用ThinkPHP(其他框架未使用,但是相信1天学会) 了解mvc设计模式。 html:不会设计,只会用div+css进行布局,会JS及简单特效 项目经验 OA 办公...

这回
2013/01/08
1K
14
北京求职php相关工作,实习皆可

会的技术: PHP:能熟练使用PHP开发网站,会使用ThinkPHP(其他框架未使用,但是相信1天学会) 了解mvc设计模式。 html:不会设计,只会用div+css进行布局,会JS及简单特效 项目经验 OA 办公...

这回
2012/12/09
630
11

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
9
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部