koa教程2 权限分级控制
在之前的代码中,我们使用了一个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;
版权申明
本文系作者 @木灵鱼儿 原创发布在木灵鱼儿站点。未经许可,禁止转载。
暂无评论数据