egg(50)--rbac之根据当前登录用户的权限动态显示左侧菜单

service

service/admin.js
  1. 获取全部的权限
  2. 查询当前角色拥有的权限(查询当前角色的权限id) 把查找到的数据放在数组中
  3. 循环遍历所有的权限数据 判断当前权限是否在角色权限的数组中, 如果在角色权限的数组中:选中 如果不在角色权限的数组中不选中
  async getAuthList(role_id){
    //1、获取全部的权限
    var result = await this.ctx.model.Access.aggregate([
      {
        $lookup: {
          from: 'access',
          localField: '_id',
          foreignField: 'module_id',
          as: 'items'
        }
      },
      {
        $match: {
          "module_id": '0'
        }
      }
    ]);
    // console.log(JSON.stringify(result))
    //2、查询当前角色拥有的权限(查询当前角色的权限id) 把查找到的数据放在数组中
    var accessReulst = await this.ctx.model.RoleAccess.find({
      "role_id": role_id
    });
    // console.log(accessReulst)
    var roleAccessArray = [];
    accessReulst.forEach(function (value) {
      roleAccessArray.push(value.access_id.toString());
    })
    console.log(roleAccessArray)
    // console.log(roleAccessArray);

    // 3、循环遍历所有的权限数据     判断当前权限是否在角色权限的数组中
    for (var i = 0; i < result.length; i++) {
      if (roleAccessArray.indexOf(result[i]._id.toString()) != -1) {
        result[i].checked = true;
      }
      for (var j = 0; j < result[i].items.length; j++) {
        if (roleAccessArray.indexOf(result[i].items[j]._id.toString()) != -1) {
          result[i].items[j].checked = true;
        }
      }
    }
    // console.log(result);
    return result;
  }

middleware

middleware/adminauth.js

增加ctx.state.asideList = await ctx.service.admin.getAuthList(ctx.session.userinfo.role_id);
全部代码

const url = require('url')
module.exports = options => {
    return async function adminauth(ctx, next) {
        // 1.用户没有登录跳转到登录页面
        // 2.只有登录以后才可以访问后台管理系统
        var pathname = url.parse(ctx.request.url).pathname;
        console.log(pathname)
        //csrf
        ctx.state.csrf = ctx.csrf;
        ctx.state.prevPage = ctx.request.headers['referer'];  //获取上一页的url
        if(ctx.session.userinfo){
            ctx.state.userinfo = ctx.session.userinfo;
            // await next();
            //登录权限判断
            var hasAuth = await ctx.service.admin.checkAuth();
            if(hasAuth){
                ctx.state.asideList = await ctx.service.admin.getAuthList(ctx.session.userinfo.role_id);
                await next();
            }else{
                ctx.body = '你没有权限访问当前地址'
            }
        }else{
            // 排除不需要做杼判断的页面    admin/verify?mt=0.7755167188853835
            if(pathname == '/admin/login' || pathname == '/admin/doLogin' || pathname == '/admin/verify'){
                await next()
            }else{
                ctx.redirect('/admin/login')
            }
        }

    };
};

view

admin/public/page_aside.html
  1. is_super=1超级管理员 default:0
  2. type节点类型

    1. 表示模块(红色)
    2. 表示菜单(黄色)
    3. 操作
<ul class="aside">
    <%for(var i=0;i<asideList.length;i++){%>
    <li>
        <%if((asideList[i].checked && asideList[i].type==1) || (userinfo.is_super==1&& asideList[i].type==1)){%>
        <h4>
            <%=asideList[i].module_name %>
        </h4>
        <ul>
            <%for(var j=0;j<asideList[i].items.length;j++){%>
            <%if((asideList[i].items[j].checked && asideList[i].items[j].type!=3) || (userinfo.is_super==1 && asideList[i].items[j].type!=3)){%>
            <li class="list-group-item"> <a href="<%=asideList[i].items[j].url%>">
                    <%=asideList[i].items[j].action_name %></a></li>
            <%}%>
            <%}%>
        </ul>
        <%}%>
    </li>
    <%}%>
</ul>

实例 市场部门lisi

查看管理员所属角色

clipboard.png

查看角色拥有的权限

clipboard.png

管理员登录,所能看到和操作的url

clipboard.png

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值