前提条件: 每个管理员拥有单一的角色!
一个管理员拥有多个角色的一个样 只不过加上一个中间表而已 后续更新一下!
角色表:
CREATE TABLE `yt_system_role` (
`id` int(11) NOT NULL AUTO_INCREMENT,--角色id
`name` varchar(20) DEFAULT NULL,--角色名称
`type` int(11) DEFAULT NULL,--角色类型 1:前台用户角色 2:后台用户角色
PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8
权限表:(其实也就是菜单的集合)
CREATE TABLE `yt_system_menu` (
`id` int(11) NOT NULL AUTO_INCREMENT,--权限id
`parentid` int(11) DEFAULT NULL,--父类id
`name` varchar(20) DEFAULT NULL,--权限名称
`url` varchar(100) DEFAULT NULL,--链接地址
`icon` varchar(100) DEFAULT NULL,--图标
`level` int(11) DEFAULT NULL,--用来做无限极分类用的
`sort` int(11) DEFAULT NULL,--排序使用
PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8
角色和权限中间表:
CREATE TABLE `yt_system_role_rights` (
`id` int(11) NOT NULL AUTO_INCREMENT,--主键id
`role_id` int(11) DEFAULT NULL,--角色id
`menu_id` int(11) DEFAULT NULL,--权限id
PRIMARY KEY (`id`)
) ENGINE=InnoDB CHARSET=utf8
其实就是角色表 权限表 然后就是角色对应哪些权限呢 就又多了个中间表 因为权限和角色之间是多对多的关系!
管理员表:
在管理员表当中要新建一个字段 比如叫做type_id 用来表示该用户所属于的角色 或者叫role_id;
管理员拥有单一角色的功能表的设计就是上边讲到的!
===========================================================================
下边讲如何在代码当中实现:
第一步:
涉及到登陆
登陆流程当中:
A 判断验证码
B 根据用户名判断用户是否存在 或者判断该用户账户是否被禁用!
C 如果用户存在以及没有被禁用 那么我们需要判断他的角色 因为我们在设计表的时候已经新建表yt_system_role的时候建立了一个type表 1:前台 2:后台 判断用户的角色是前台角色还是后台角色 如果不是后台角色也就是type != 2 那么提示错误信息 终止程序!
D 判断用户密码是否正确;在判断的时候不要忘记加上密钥 更加的安全!
第二步:
按照道理来说 我们上边的验证都通过了 就应该直接跳转到首台界面的首页 但是不同的用户角色不同那么权限不同,权限不同那么现实的菜单也就不同;所以在显示后台界面之前我们需要读取出这个用户所属于的角色的全部的权限 也就是说这个角色进入到后台首页能够看到的菜单有哪些?
拿着用户表记录里面的type_id角色id 就可以知道是是角色 然后通过这个角色的id判断出这个角色对应的权限 从而获取到该用户所有的权限信息;
//比如$role_id 就是传递过来的角色的id; 我们在判断该角色拥有哪些权限的时候需哟一个特俗的判断就是超级管理员 所以我们需要做一个判断就是 我们需要在角色表当中规定超级管理员的id = 1 如果传递过来的$role_id = 1 那么就拥有全部的权限 也就是可以看到所有的菜单!
public function get_menus($role_id=0)
{
$sql="";
//超级管理员拥有所有的权限!
if($role_id == 1)
$sql="SELECT id,parentid,name,url,icon,level FROM ".$this->db->dbprefix."system_menu ORDER BY sort ASC,id ASC";
else
$sql="SELECT id,parentid,name,url,icon,level FROM ".$this->db->dbprefix."system_menu WHERE id IN(SELECT menu_id FROM ".$this->db->dbprefix."system_role_rights WHERE role_id = $role_id) ORDER BY sort ASC,id ASC";
$query=$this->db->query($sql);
$result = $query->result_array();
return !empty($result) ? $result : array();
}
查询出来的结果一定会是一个二维数组 但是如何在页面当中展现呢?
$this->user->_menu 表示查询出来的全部的菜单;
$m['level'] = 1是一个限制条件 表示他是父类
两层foreach循环 $m2['parentid'] == $m['id'] 保证了父子关系的呈现!
至于js效果自己去找吧! 操!
<?php
$menu_list='';
foreach($this->user->_menu as $m)
{
if($m['level'] == 1)
{
$menu_list .='<li><a class="a" href="'.$m['url'].'"><img src="'.$m['icon'].'" height="26" /><b>'.$m['name'].'</b></a><dl>';
foreach($this->user->_menu as $m2)
{
if($m2['parentid'] == $m['id'])
{
$menu_list.='<dd><a href="'.$m2['url'].'" target="c"><img src="'.$m2['icon'].'" />'.$m2['name'].'</a></dd>';
}
}
$menu_list .='</dl></li>';
}
}
echo $menu_list;
?>
分析表和表之间的关联关系:
用户表的type_id 角色id -------------------- 角色表当中的id
角色表当中的id -------------------- 权限角色中间表当中的role_id
权限表当中的id -------------------- 权限角色中间表当中的menu_id(其实也叫菜单id)
RBAC权限就是这么一个流程!