如何根据请求头Token动态设置Express JS路由的验证中间件
根据请求头Token动态切换Express校验中间件
要实现根据请求头Token动态选择校验规则,核心是用一个包装中间件延迟校验规则的选择时机——因为路由注册时中间件就会被执行,而我们需要在请求实际到达时,根据请求头里的Token来决定用哪套校验逻辑。
步骤1:编写动态校验中间件工厂
创建一个函数,返回一个Express中间件,在这个中间件里读取请求头Token、判断校验类型,再调用对应的校验链:
// 封装动态校验逻辑的中间件工厂 const dynamicValidate = (infoInstance: typeof this.info) => { return (req: express.Request, res: express.Response, next: express.NextFunction) => { // 从请求头提取Token(根据你的实际Token格式调整,比如Bearer Token) const token = req.headers.authorization?.split(' ')[1]; // 这里替换成你的Token判断逻辑:根据Token返回对应的校验类型 const typecheck = token ? (/* 示例:验证Token是否有权限使用check2 */ checkTokenPermission(token) ? 'check2' : 'check1') : 'check1'; // 获取对应的校验链并执行 const validationMiddleware = infoInstance.validate(typecheck); validationMiddleware(req, res, next); }; }; // 示例:Token权限判断函数(根据你的业务逻辑实现) function checkTokenPermission(token: string): boolean { // 比如验证Token签名、解析后判断用户权限等 const decoded = verifyToken(token); return decoded?.role === 'admin'; // 假设admin用户用check2校验 }
步骤2:修改路由注册
把原来固定的this.info.validate("check1")替换成上面的动态中间件:
this.router.post( "/", myInfoMiddleware, dynamicValidate(this.info), // 动态选择校验规则 this.info.account );
异步场景处理
如果你的Token验证是异步操作(比如查询数据库确认权限),可以把中间件改成异步函数:
const dynamicValidate = (infoInstance: typeof this.info) => { return async (req: express.Request, res: express.Response, next: express.NextFunction) => { const token = req.headers.authorization?.split(' ')[1]; let typecheck = 'check1'; if (token) { // 异步验证Token权限 const hasCheck2Access = await fetchUserPermissionFromDB(token); typecheck = hasCheck2Access ? 'check2' : 'check1'; } const validationMiddleware = infoInstance.validate(typecheck); await validationMiddleware(req, res, next); }; };
额外优化
为了避免validate方法返回undefined,建议在switch语句里添加default分支:
public validate(typecheck: string) { switch(typecheck) { case "check1": { return check1_validation } case "check2": { return check2_validation } default: { return check1_validation; // 默认用check1兜底 } } }
内容的提问来源于stack exchange,提问作者DigiLeon
相关产品推荐
相关产品推荐

