Thinkphp中的RBAC使用详解

来源:互联网 发布:js 数组对象合并 编辑:程序博客网 时间:2024/05/18 02:29

 1.什么是RBAC

            基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。


2.Thinkphp中的RBAC:

首先是RBAC用到的五张表(其中rbac是表的前缀,可在配置文件database.php中配置):

rbac_user(用户表):

CREATE TABLE IF NOT EXISTS `rbac_user` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(20) NOT NULL,  `email` varchar(30) NOT NULL,  `is_admin` tinyint(1) NOT NULL DEFAULT '0',  `status` tinyint(1) NOT NULL DEFAULT '1',  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  `password` varchar(50) NOT NULL,  `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  PRIMARY KEY (`id`)) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=113 ;

rbac_role(角色表)

CREATE TABLE IF NOT EXISTS `rbac_role` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `name` varchar(30) NOT NULL,  `status` tinyint(1) NOT NULL DEFAULT '1',  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  PRIMARY KEY (`id`)) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=10 ;
rbac_access(权限表,存放的是页面的url):

CREATE TABLE IF NOT EXISTS `rbac_access` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `title` varchar(50) NOT NULL ,  `urls` varchar(1000) NOT NULL,  `status` tinyint(1) NOT NULL DEFAULT '1',  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  `create_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',  PRIMARY KEY (`id`)) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=16 ;

rbac_userrole(用户角色表,存放用户和角色的关系表):

CREATE TABLE IF NOT EXISTS `rbac_userrole` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `uid` int(11) NOT NULL,  `role_id` char(20) NOT NULL,  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  PRIMARY KEY (`id`)) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=25 ;

rbac_roleaccess(角色权限表,存放的角色和权限之间的关系表):

CREATE TABLE IF NOT EXISTS `rbac_roleaccess` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `role_id` int(11) NOT NULL,  `access_id` char(30) NOT NULL,  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,  PRIMARY KEY (`id`)) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;


3.RBAC中的关系模型图:


实现的功能:



4.实现RBAC是的几个方法:

    array_column() 返回输入数组中某个单一列的值。用于取出角色表中或其他表中的某一列的值用这个函数比较方便。

   in_array() 函数搜索数组中是否存在指定的值。在编辑用户的角色的页面展示用户属于的角色时,可以用这个函数判断出用户所属角色的id,展示到页面。如下:  

{if condition=" in_array($vo['id'],$role_id)"} checked {/if}

$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"]  //用于获取用户访问当前页面的url

array_diff()比较两个数组的键值,并返回差集,array_intersect()比较两个数组的键值,并返回交集


总结:RBAC具体的流程是:根据用户登陆的信息判断用户是否有访问该页面的权限,如果没有权限可以通过超级管理员设置,过程是:先添加一个权限(页面的url),然后给角色分配权限,最后给用户分配角色的流程。


具体实现的代码可以参考慕课网的视屏:http://www.imooc.com/video/14133

    

   





原创粉丝点击