权限管理

    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

https://blog.csdn.net/zp_00000/article/details/51236719

分享此文到: