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