• 我转过几个弯 绕过那个小雨楼
  • 拿着蒲扇摆着衣衫渡着紧箍咒
  • 不问天涯不停留 喝过几壶酒
  • 不过年少白头道义放胸口
  • 倘若明天之后 遥看前尘剑封侯
  • 似那天上神仙无所求
  • 朝朝暮暮君如梦醒十分不为何理由
  • 是真是假是惶恐是无休
  • 路过这风雨花满楼 片刻都不停留
  • 我本这书生进京赶考留下许多愁
  • 你问有没有时候 我叹这天道默悠悠
  • 能否与我一醉方休
  • 又过了几个弯 算尽天量道莫慌
  • 踏这田园闻这芳草香
  • 跌跌撞撞仗剑天涯折煞不枉无笔良
  • 是梦是幻是温柔是家乡
  • 路过这风雨花满楼 片刻都不停留
  • 我本这书生进京赶考留下许多愁
  • 你问有没有时候 我叹这天道默悠悠
  • 能否与我一醉方休
  • 路过这风雨花满楼 片刻都不停留
  • 我本这书生进京赶考留下许多愁
  • 你问有没有时候 我叹这天道默悠悠
  • 能否与我一醉方休
  • 谁能与我一醉方休

koa教程2 权限分级控制

202 0

在之前的代码中,我们使用了一个scope属性来表示用户的权限,但是scope是一个数字,他的阅读性是非常差的,当其他人开发的时候,可能并不知道你这个数字是什么意思?

所以,我们需要将它转义成文本。

为了方便判断,我们在enum.js中增加一个用户等级的对象

enum.js:

//通用判断是否存在该类型
function isThisType(val) {
  let flag = false;
  Object.keys(this).find(key => {
    if (this[key] === val) {
      return flag = true;
    }
  });
  return flag;
};


//登录类型
const LoginType = {
  USER_MINI_PROGRAM: 1,  //小程序
  USER_EMAIL: 2, //邮箱
  USER_MOBILE: 3, //手机
  isThisType,
};

//用户等级
const UserLevel = {
  USER: 8, //普通用户
  ADMIN: 16, //管理员
  SUPER_ADMIN: 32, //超级管理员-站长
  isThisType,
}

module.exports = {
  LoginType,
  UserLevel
}

然后我们在登录的时候,创建token时传入对应的值:

const { UserLevel } = require("@lib/enum");


//邮箱+密码登录
async function emailLogin(account, password) {
  const user =
    await User.verifyEmailPassword(account, password);
  //生成token
  return createToken(user.id, UserLevel.USER);
};

然后Auth中间件就可以开始判断:

auth.js:

const parseBearerToken = require("@utils/paresBearerToken");
const jwt = require("jsonwebtoken");
const { tokenConfig } = require("@config/config");
const { TokenError, AuthFailed } = require("@core/http-error");


class Auth {
  constructor(level) {
    this.level = level;

  }
  get token() {
    return async (ctx, next) => {
      //获取头信息中的token
      const token = parseBearerToken(ctx.header);
      //解析token
      try {
        var decode = jwt.verify(token, tokenConfig.key);
      } catch (error) {
        //token解析错误
        let errorMsg = "token解析失败"
        if (error.name === "TokenExpiredError") {
          errorMsg = "token已失效";
        };
        throw new TokenError(errorMsg);
      }

      //权限
      if (decode.scope < this.level) {
        throw new AuthFailed("权限不足");
      }

      //赋值到ctx
      ctx.auth = decode;

      //下一个中间件
      await next();
    }
  }
}


module.exports = { Auth };

new Auth时需要接收一个参数,这个参数表示这个接口的权限等级,我们还需要在路由里面加上参数:

例子:

const Router = require("koa-router");
const router = new Router();
const { Auth } = require("@/middlewares/auth");
const { UserLevel } = require("@lib/enum");


router.post("/test1", new Auth(UserLevel.ADMIN).token, (ctx, next) => {

  ctx.body = ctx.auth

});


module.exports = router;
0
  • 本文分类:Node
  • 本文标签:nodekoa权限分级
  • 流行热度:已超过 202 人围观了本文
  • 最后更新:2021年03月21日 - 18时20分47秒
  • 发布日期:2021年03月21日 - 18时20分47秒
  • 版权申明:本文系作者@木灵鱼儿原创发布在木灵鱼儿 - 有梦就能远航站点。未经许可,禁止转载。

相关文章

微信收款码
微信收款码