Role-Based-Access-Control是指用户基于角色的访问控制(简称RBAC)。通俗的将是,一个用户拥有多个角色,一个角色用户拥有多个权限,则用户通过角色与权限进行关联,这就构造成“用户-角色-权限”的权限模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。因此,这种模型可以用五个数据表进行构建:用户表、角色表、权限表、用户-角色关系表、角色-权限关系表。
实现方法如下:
方法一
1、通过登录获取用户ID,通过用户ID获取用户角色ID组(一对多的关系);
2、通过获取当前权限(控制器名/方法名)得到权限ID,通过权限ID获取拥有该权限的角色ID组(一对多);
3、通过函数array_intersect()获取1 和 2的公共部分,如果为空则表示没有权限,反之有权限。
方法二
1、通过登录获取用户ID,通过用户ID获取用户角色ID组;
2、通过用户角色获取角色拥有的权限;
3、查询权限中是否拥有当前访问权限(控制器名/方法名)。
注意:方法一的实现方法比方法二的实现方法容易,是比较适合进行权限设计的。
使用方法一实现代码如下:将下面的方法放在公共控制器中,可以在控制器初始化方法中进行所有的权限检查,也可以放在指定方法中使用。
public function checkPower()
{
// 获取当前用户的ID
$adminId = session('uid');
// 获取当前用户对应的角色
$roleIdList = M('AdminRole')->where(array('admin_id'=>$adminId))->getField('rid',true);
// 获取当前控制器和方法【拼接】
$power = CONTROLLER_NAME.'/'.ACTION_NAME;
//设置首页所有登录用户可访问
if($power == "Index/index"){
return 1;
}
// 查询当前(控制器/方法)对应的权限的ID
$power_id = M('Power')->where(array('power_url'=>$power))->getField('power_id');
// 查询当前权限对应的所有角色
$roleId = M('RolePower')->where(array('pid'=>$power_id))->getField('rid',true);
// 检测是否有公共项
$result = array_intersect($roleIdList, $roleId);
return $result;
}
数据表设计如下:用户表(admin)、角色表(role)、权限表(power)、用户-角色关系表(admin-role)、角色-权限关系表(role-power)。
CREATE TABLE `admin` (
`admin_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`admin_name` varchar(20) DEFAULT NULL,
`admin_pwd` varchar(50) DEFAULT NULL,
`last_time` int(20) DEFAULT NULL,
`error_time` int(10) NOT NULL DEFAULT '0',
PRIMARY KEY (`admin_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
CREATE TABLE `role` (
`role_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`role_name` varchar(20) NOT NULL,
`role_status` int(10) NOT NULL DEFAULT '1' COMMENT '启用状态\r\n 启用 1(默认) \r\n停用 0\r\n\r\n',
PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
CREATE TABLE `power` (
`power_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`power_name` varchar(255) DEFAULT NULL,
`power_url` varchar(50) DEFAULT NULL,
PRIMARY KEY (`power_id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;
CREATE TABLE `admin_role` (
`a_r_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`aid` int(10) NOT NULL,
`rid` int(10) NOT NULL,
PRIMARY KEY (`a_r_id`)
) ENGINE=InnoDB AUTO_INCREMENT=56 DEFAULT CHARSET=utf8;
CREATE TABLE `role_power` (
`r_p_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`rid` int(10) DEFAULT NULL,
`pid` int(10) DEFAULT NULL,
PRIMARY KEY (`r_p_id`)
) ENGINE=InnoDB AUTO_INCREMENT=87 DEFAULT CHARSET=utf8;
参考:https://blog.csdn.net/nw_ningwang/article/details/78502955
木庄网络博客(2016/10/28 11:41:03)
不错的网站主题,看着相当舒服