您的位置:首页 > 编程语言 > PHP开发

Thinkphp中的RBAC使用详解

2017-09-24 18:39 323 查看
 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 ;
<
4000
br />

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

    
   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: