在之前的代码中,我们使用了一个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;
分类: Node 标签: nodekoa权限分级

评论

暂无评论数据

暂无评论数据

目录