egg(49)--rbac之判断当前登录用户的权限

简介

  1. 获取当前用户的角色
  2. 根据角色获取当前角色的权限列表
  3. 获取当前访问的url对应的权限id
  4. 判断当前访问的url对应的权限id 是否存在权限列表的id中
  5. 在中间件中判断,因为每个路由之前都要走中间件

service

service/admin.js
  async checkAuth() {
    // 1.获取当前用户的角色
    // 2.根据角色获取当前角色的权限列表
    // 3.获取当前访问的url对应的权限id
    // 4.判断当前访问的url对应的权限id 是否存在权限列表的id中

    // 1.
    var userinfo = this.ctx.session.userinfo;
    var role_id = userinfo.role_id;
    var pathname = url.parse(this.ctx.request.url).pathname;

    //忽略权限判断的地址 is_super=1表示超级管理员
    var ignoreUrl = ['/admin/login','/admin/doLogin','/admin/verify','/admin/loginOut']

    if(ignoreUrl.indexOf(pathname) !=-1  || userinfo.is_super == 1){
        return true;  //允许访问
    }
    // 2.
    var accessResult = await this.ctx.model.RoleAccess.find({"role_id":role_id})
    var accessArray = [];
    accessResult.forEach(function(value){
        accessArray.push(value.access_id.toString());
    })
    // 3.
    
    var accessUrlResult = await this.ctx.model.Access.find({"url":pathname})

    // 4.
    if(accessUrlResult.length >0){
        if(accessArray.indexOf(accessUrlResult[0]._id.toString())!= -1){
            return true;
        }
        return false;
    }
    return false;
  }

middleware

middleware/adminauth.js

增加的代码

var hasAuth = await ctx.service.admin.checkAuth();
            if(hasAuth){
                await next();
            }else{
                ctx.body = '你没有权限访问当前地址'
            }

全部代码

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){
                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')
            }
        }

    };
};
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值