diff --git a/src/modules/user/middleware/app.ts b/src/modules/user/middleware/app.ts new file mode 100644 index 0000000..5988fa7 --- /dev/null +++ b/src/modules/user/middleware/app.ts @@ -0,0 +1,66 @@ +import { ALL, Config, Middleware } from '@midwayjs/core'; +import { NextFunction, Context } from '@midwayjs/koa'; +import { IMiddleware, Init, Inject } from '@midwayjs/core'; +import * as jwt from 'jsonwebtoken'; +import * as _ from 'lodash'; +import { CoolCommException, CoolUrlTagData, TagTypes } from '@cool-midway/core'; +import { Utils } from '../../../comm/utils'; + +/** + * 用户 + */ +@Middleware() +export class UserMiddleware implements IMiddleware { + @Config(ALL) + coolConfig; + + @Inject() + coolUrlTagData: CoolUrlTagData; + + @Config('module.user.jwt') + jwtConfig; + + ignoreUrls: string[] = []; + + @Config('koa.globalPrefix') + prefix; + + @Inject() + utils: Utils; + + @Init() + async init() { + this.ignoreUrls = this.coolUrlTagData.byKey(TagTypes.IGNORE_TOKEN, 'app'); + } + + resolve() { + return async (ctx: Context, next: NextFunction) => { + let { url } = ctx; + url = url.replace(this.prefix, '').split('?')[0]; + if (_.startsWith(url, '/app/')) { + const token = ctx.get('Authorization'); + try { + ctx.user = jwt.verify(token, this.jwtConfig.secret); + + if (ctx.user.isRefresh) { + throw new CoolCommException('登录失效~'); + } + } catch (error) {} + // 使用matchUrl方法来检查URL是否应该被忽略 + const isIgnored = this.ignoreUrls.some(pattern => + this.utils.matchUrl(pattern, url) + ); + if (isIgnored) { + await next(); + return; + } else { + if (!ctx.user) { + ctx.status = 401; + throw new CoolCommException('登录失效~'); + } + } + } + await next(); + }; + } +}