当前位置: 首页 > 工具软件 > Simple RBAC > 使用案例 >

数据库(简单的RBAC权限设计表结构)

樊博雅
2023-12-01

1、用户表(主要用来存储后台管理员用户的基本信息,并关联于角色表,可以做成单用户多角色)

user 用户表
字段名称类型长度注释
idint11主键
accountvarchar32后台管理员账号
pwdchar32后台管理员密码
real_namevarchar16后台管理员姓名
rolesvarchar128后台管理员权限(role表的id)多角色可以用逗号隔开例如:1,2,3
last_ipvarchar16后台管理员最后一次登录ip
last_timedatetime0后台管理员最后一次登录时间
add_timedatetime0后台管理员添加时间
login_countint10登录次数
statustinyint1后台管理员状态 1有效0无效
is_deltinyint1是否删除1删除0显示

2、侧边导航栏表(存储方式可以通过控制接口或者控制显示方式来显示菜单权限)

menus   侧边导航栏表
字段名称类型长度注释
idsmallint5菜单ID
pidsmallint5父级id
iconvarchar25图标
menu_namevarchar32按钮名
modulevarchar32模块名
controllervarchar64控制器
actionvarchar32方法名
paramsvarchar128参数
pathvarchar255跳转路径
sorttinyint3排序
is_showtinyint1是否显示

 

3、角色管理表(配置管理员各种身份的表,主要用于关联权限表)

role  角色管理表
字段名称类型长度注释
idint10身份管理id
role_namevarchar32身份管理名称
menus_idtext0身份管理权限(menus_id)例如:1,2,3
statustinyint1状态

 

4、侧边栏整理遍历父子级代码

    /**
     * 初始化左菜单
     * 先取出系统中所有菜单,
     * 将菜单按父级子级关系分组
     * 同时如果当前租户权限设置中限定了该菜单,则判断当前用户是否有权限访问当前页面,如果没有则过滤掉
     *
     * 已经修改了view类,给view方法设置默认参数,不需要每个页面都传入menus,此处写法是基于ThinkPhP 5.1 由于不是前后端分离所以将数据存储到view类里,便于前端读取
     */
    protected function rolelist()
    {
        $seachmap = [];
        if(Session::get('campus.user_role'))
		{
            $seachmap['role_code'] = Session::get('campus.user_role');
        }else{
            $seachmap['role_code'] = Session::get('admin.user_role');
        }
        $list = Users::instance()->getrolelist($seachmap); //根据权限查出当前用户所拥有的所有导航栏,然后进行处理。
        $menus = [];
        if (!empty($list->result)) {
            // 遍历系统所有菜单
            foreach ($list->result as $v) {
                // 如果没有父级 则为根节点
                if ($v['module_parentcode'] == 0) {

                    if(!isset($menus[$v['module_code']]))
                    {
                        $menus[$v['module_code']] = $v;
                    }
                }
            }
            foreach ($list->result as $v)
            {
                foreach($menus as $key=>$value)
                    if($v['module_parentcode'] == $key)
                    {
                        if (!isset($menus[$value['module_code']]['child'][$v['module_code']]))
                        {
                            $menus[$value['module_code']]['child'][$v['module_code']] = $v;
                        }
                    }
            }
        }else{
            Session::clear();
            $this->error('您没有访问权限',url('/adminlogin/login'),'','2');
        }
        // 如果父级节点下 没有任何可以显示的子级节点,则不显示该父级
        foreach ($menus as $k => $v) {
            if (!isset($v['child'])||count($v['child']) == 0) {
                unset($menus[$k]);
            }
        }
        $menus['num'] = 0;
        $this->view->set_default_vars(['menus' => $menus]);
        return;
    }

 

 类似资料: