RBAC权限实现

思路

rbac数据库表结构:
1.users表(用户表,用于用户登录,存储uid到seesion中,进而进行权限控制)
核心字段:
id //用户id
username //用户名
password //密码
2.auth_group表 (用户组表,一个用户可以属于多个组,一个组可以有多个用户,属于多对多,用户连接组对应的权限)
核心字段:
id //组id
title //组名称
rules //组的权限,1,2(这里由数字和逗号拼接组成,每个id代表一个权限id,即rule_id,即auth_rule这个表的主键)
3.auth_group_access表(用户和用户组的对应关系,是用户表和用户组表的一个中间表,启动连接作用)
核心字段:
uid //用户id
group_id //组id
4.auth_rule表(权限表,用于存放权限名称以及权限)
核心字段:
id //rule_id权限id
pid //父id
name //权限的url地址
title //权限的名称
5.admin_nav表(后台菜单表,用于将url和菜单进行关联,进而和权限进行关联)
核心字段:
id //菜单id
pid //父id
name //菜单名称
mca //既是菜单的url也是权限的url,用户关联权限表
order_num //用于菜单权重排序

数据库关联顺序
users<->auth_group_access<->auth_group<->auth_rule<->admin_nav

本质上rbac其实是:uid->url之间的对应权限关系(0,1)
权限控制的根本:
落实到代码上实际是http请求到对应页面(controller对应的action)的时候进行的拦截判断处理。

数据库表设计

/*
Navicat MySQL Data Transfer

Source Server         : localhost
Source Server Version : 50553
Source Host           : 127.0.0.1:3306
Source Database       : dk

Target Server Type    : MYSQL
Target Server Version : 50553
File Encoding         : 65001

*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for dk_admin_nav
-- ----------------------------
DROP TABLE IF EXISTS `dk_admin_nav`;
CREATE TABLE `dk_admin_nav` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '菜单表',
  `pid` int(11) unsigned DEFAULT '0' COMMENT '所属菜单',
  `name` varchar(15) DEFAULT '' COMMENT '菜单名称',
  `mca` varchar(255) DEFAULT '' COMMENT '模块、控制器、方法',
  `ico` varchar(20) DEFAULT '' COMMENT 'font-awesome图标',
  `order_number` int(11) unsigned DEFAULT NULL COMMENT '排序',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=43 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of dk_admin_nav
-- ----------------------------
INSERT INTO `dk_admin_nav` VALUES ('1', '0', '系统设置', 'admin/shownav/config', 'cog', '1');
INSERT INTO `dk_admin_nav` VALUES ('2', '1', '菜单管理', 'admin/nav/index', null, null);
INSERT INTO `dk_admin_nav` VALUES ('7', '4', '权限管理', 'admin/rule/index', '', '1');
INSERT INTO `dk_admin_nav` VALUES ('4', '0', '权限控制', 'admin/shownav/rule', 'expeditedssl', '2');
INSERT INTO `dk_admin_nav` VALUES ('8', '4', '用户组管理', 'admin/rule/group', '', '2');
INSERT INTO `dk_admin_nav` VALUES ('9', '4', '管理员列表', 'admin/rule/admin_user_list', '', '3');
INSERT INTO `dk_admin_nav` VALUES ('16', '0', '会员管理', 'admin/shownav/', 'users', '4');
INSERT INTO `dk_admin_nav` VALUES ('17', '16', '会员列表', 'admin/member/index', '', null);
INSERT INTO `dk_admin_nav` VALUES ('36', '0', '文章管理', 'admin/shownav/article', 'th', '6');
INSERT INTO `dk_admin_nav` VALUES ('37', '36', '文章列表', 'admin/article/index', '', null);
INSERT INTO `dk_admin_nav` VALUES ('42', '36', '添加文章', 'admin/article/add', 'th', null);

-- ----------------------------
-- Table structure for dk_auth_group
-- ----------------------------
DROP TABLE IF EXISTS `dk_auth_group`;
CREATE TABLE `dk_auth_group` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` char(100) NOT NULL DEFAULT '',
  `status` tinyint(1) NOT NULL DEFAULT '1',
  `rules` text COMMENT '规则id',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COMMENT='用户组表';

-- ----------------------------
-- Records of dk_auth_group
-- ----------------------------
INSERT INTO `dk_auth_group` VALUES ('1', '超级管理员', '1', '6,96,20,1,2,3,4,5,64,21,7,8,9,10,11,12,13,14,15,16,123,124,125,19,104,105,106');
INSERT INTO `dk_auth_group` VALUES ('2', '产品管理员', '1', '6,96,104,105,106');
INSERT INTO `dk_auth_group` VALUES ('4', '文章编辑', '1', '6,96,57,60,61,63,71,72,65,67,74,75,66,68,69,73,79,80,78,82,83,88,89,90,99,100,97,98,104,105,106,107,108,118,109,110,111,112,117,113,114');

-- ----------------------------
-- Table structure for dk_auth_group_access
-- ----------------------------
DROP TABLE IF EXISTS `dk_auth_group_access`;
CREATE TABLE `dk_auth_group_access` (
  `uid` int(11) unsigned NOT NULL COMMENT '用户id',
  `group_id` int(11) unsigned NOT NULL COMMENT '用户组id',
  UNIQUE KEY `uid_group_id` (`uid`,`group_id`),
  KEY `uid` (`uid`),
  KEY `group_id` (`group_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户组明细表';

-- ----------------------------
-- Records of dk_auth_group_access
-- ----------------------------
INSERT INTO `dk_auth_group_access` VALUES ('88', '1');
INSERT INTO `dk_auth_group_access` VALUES ('88', '2');
INSERT INTO `dk_auth_group_access` VALUES ('88', '4');
INSERT INTO `dk_auth_group_access` VALUES ('89', '2');
INSERT INTO `dk_auth_group_access` VALUES ('89', '4');
INSERT INTO `dk_auth_group_access` VALUES ('90', '1');
INSERT INTO `dk_auth_group_access` VALUES ('90', '2');

-- ----------------------------
-- Table structure for dk_auth_rule
-- ----------------------------
DROP TABLE IF EXISTS `dk_auth_rule`;
CREATE TABLE `dk_auth_rule` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `pid` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '父级id',
  `name` char(80) NOT NULL DEFAULT '' COMMENT '规则唯一标识',
  `title` char(20) NOT NULL DEFAULT '' COMMENT '规则中文名称',
  `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态:为1正常,为0禁用',
  `type` tinyint(1) unsigned NOT NULL DEFAULT '1',
  `condition` char(100) NOT NULL DEFAULT '' COMMENT '规则表达式,为空表示存在就验证,不为空表示按照条件验证',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=129 DEFAULT CHARSET=utf8 COMMENT='规则表';

-- ----------------------------
-- Records of dk_auth_rule
-- ----------------------------
INSERT INTO `dk_auth_rule` VALUES ('1', '20', 'admin/shownav/nav', '菜单管理', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('2', '1', 'admin/nav/index', '菜单列表', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('3', '1', 'admin/nav/add', '添加菜单', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('4', '1', 'admin/nav/edit', '修改菜单', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('5', '1', 'admin/nav/delete', '删除菜单', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('21', '0', 'admin/shownav/rule', '权限控制', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('7', '21', 'admin/rule/index', '权限管理', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('8', '7', 'admin/rule/add', '添加权限', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('9', '7', 'admin/rule/edit', '修改权限', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('10', '7', 'admin/rule/delete', '删除权限', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('11', '21', 'admin/rule/group', '用户组管理', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('12', '11', 'admin/rule/add_group', '添加用户组', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('13', '11', 'admin/rule/edit_group', '修改用户组', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('14', '11', 'admin/Rule/delete_group', '删除用户组', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('15', '11', 'admin/Rule/rule_group', '分配权限', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('16', '11', 'admin/Rule/check_user', '添加成员', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('19', '21', 'admin/rule/admin_user_list', '管理员列表', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('20', '0', 'Admin/ShowNav/config', '系统设置', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('6', '0', 'admin/Index/index', '后台首页', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('64', '1', 'Admin/Nav/order', '菜单排序', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('96', '6', 'admin/Index/welcome', '欢迎界面', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('104', '0', 'admin/shownav/article', '文章管理', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('105', '104', 'admin/article/index', '文章列表', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('106', '105', 'admin/article/add', '添加文章', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('123', '11', 'admin/rule/add_user_to_group', '设置为管理员', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('124', '11', 'admin/rule/add_admin', '添加管理员', '1', '1', '');
INSERT INTO `dk_auth_rule` VALUES ('125', '11', 'admin/rule/edit_admin', '修改管理员', '1', '1', '');

-- ----------------------------
-- Table structure for dk_users
-- ----------------------------
DROP TABLE IF EXISTS `dk_users`;
CREATE TABLE `dk_users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(60) NOT NULL DEFAULT '' COMMENT '用户名',
  `password` varchar(64) NOT NULL DEFAULT '' COMMENT '登录密码;mb_password加密',
  `avatar` varchar(255) NOT NULL DEFAULT '' COMMENT '用户头像,相对于upload/avatar目录',
  `email` varchar(100) NOT NULL DEFAULT '' COMMENT '登录邮箱',
  `email_code` varchar(60) DEFAULT NULL COMMENT '激活码',
  `phone` bigint(11) unsigned DEFAULT NULL COMMENT '手机号',
  `status` tinyint(1) NOT NULL DEFAULT '2' COMMENT '用户状态 0:禁用; 1:正常 ;2:未验证',
  `register_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '注册时间',
  `last_login_ip` varchar(16) NOT NULL DEFAULT '' COMMENT '最后登录ip',
  `last_login_time` int(10) unsigned NOT NULL COMMENT '最后登录时间',
  PRIMARY KEY (`id`),
  KEY `user_login_key` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=92 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of dk_users
-- ----------------------------
INSERT INTO `dk_users` VALUES ('88', 'admin', 'e10adc3949ba59abbe56e057f20f883e', '/Upload/avatar/user1.jpg', '', '', null, '1', '1449199996', '', '0');
INSERT INTO `dk_users` VALUES ('89', 'admin2', 'e10adc3949ba59abbe56e057f20f883e', '/Upload/avatar/user2.jpg', '', '', null, '1', '1449199996', '', '0');
INSERT INTO `dk_users` VALUES ('90', '444', '202cb962ac59075b964b07152d234b70', '', '1', null, '18634940189', '0', '0', '', '0');

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值