1.需求
在node后端中,想實現(xiàn)一個專門鑒權(quán)的文件配置,可以這樣來解釋 就是 有些接口需要token調(diào)用接口,有些接口不需要使用token 調(diào)用?
這期來詳細(xì)說明一下
? ? ?什么是中間件中間件顧名思義是指在請求和響應(yīng)中間,進(jìn)行請求數(shù)據(jù)的攔截處理,數(shù)據(jù)校驗,并且進(jìn)行邏輯處理后判斷是否允許進(jìn)入下一個中間件。中間件分為前綴中間件,后置中間件??梢杂糜跈?quán)限認(rèn)證。日志記錄等
2.cool 中的中間件
cool 官方的說明文檔
控制器(Controller) | COOL官網(wǎng)文章來源:http://www.zghlxwxcb.cn/news/detail-829795.html
3.用戶鑒權(quán)問題文章來源地址http://www.zghlxwxcb.cn/news/detail-829795.html
import { App, Config, Inject, Middleware } from '@midwayjs/decorator';
import * as _ from 'lodash';
import { RESCODE } from '@cool-midway/core';
import * as jwt from 'jsonwebtoken';
import { NextFunction, Context } from '@midwayjs/koa';
import { IMiddleware, IMidwayApplication } from '@midwayjs/core';
import { CacheManager } from '@midwayjs/cache';
/**
* 權(quán)限校驗
*/
@Middleware()
export class BusinessAuthorityMiddleware
implements IMiddleware<Context, NextFunction>
{
@Config('koa.globalPrefix')
prefix;
@Config('module.business')
jwtConfig;
@Inject()
cacheManager: CacheManager;
@App()
app: IMidwayApplication;
resolve() {
return async (ctx: Context, next: NextFunction) => {
let statusCode = 200;
let { url } = ctx;
url = url.replace(this.prefix, '');
const token = ctx.get('Authorization');
const adminUrl = '/app/';
//忽略token驗證的url
const ignoreUrls = [];
// 路由地址為 /app/前綴的 需要權(quán)限校驗
if (_.startsWith(url, adminUrl)) {
try {
ctx.admin = jwt.verify(token, this.jwtConfig.jwt.secret);
} catch (err) {}
// 不需要登錄 無需權(quán)限校驗
if (
new RegExp(`^${adminUrl}?.*/open/`).test(url) ||
ignoreUrls.includes(url)
) {
await next();
return;
}
if (ctx.admin) {
const rToken = await this.cacheManager.get(
`business:token:${ctx.admin.userId}`
);
// 要登錄每個人都有權(quán)限的接口
if (new RegExp(`^${adminUrl}?.*/comm/`).test(url)) {
await next();
return;
}
// 如果傳的token是refreshToken則校驗失敗
if (ctx.admin.isRefresh) {
ctx.status = 401;
ctx.body = {
code: RESCODE.COMMFAIL,
message: '(1)登錄失效~',
};
return;
}
// 判斷密碼版本是否正確
const passwordV = await this.cacheManager.get(
`business:passwordVersion:${ctx.admin.userId}`
);
if (passwordV != ctx.admin.passwordVersion) {
ctx.status = 401;
ctx.body = {
code: RESCODE.COMMFAIL,
message: '(2)登錄失效~',
};
return;
}
if (!rToken) {
ctx.status = 401;
ctx.body = {
code: RESCODE.COMMFAIL,
message: '(3)登錄失效或無權(quán)限訪問~',
};
return;
}
} else {
statusCode = 401;
}
if (statusCode > 200) {
ctx.status = statusCode;
ctx.body = {
code: RESCODE.COMMFAIL,
message: '(4)登錄失效或無權(quán)限訪問~',
};
return;
}
}
await next();
};
}
}
到了這里,關(guān)于cool Node后端 中實現(xiàn)中間件的書寫的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!