33 lines
886 B
TypeScript
33 lines
886 B
TypeScript
|
|
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
|
||
|
|
import { Reflector } from '@nestjs/core';
|
||
|
|
import { JwtAuthGuard } from './JwtAuthGuard';
|
||
|
|
|
||
|
|
@Injectable()
|
||
|
|
export class GlobalAuthGuard implements CanActivate {
|
||
|
|
constructor(
|
||
|
|
private reflector: Reflector,
|
||
|
|
private jwtAuthGuard: JwtAuthGuard,
|
||
|
|
) {}
|
||
|
|
|
||
|
|
async canActivate(context: ExecutionContext): Promise<boolean> {
|
||
|
|
// 检查是否有 @Public() 装饰器
|
||
|
|
const isPublic = this.reflector.getAllAndOverride<boolean>('isPublic', [
|
||
|
|
context.getHandler(),
|
||
|
|
context.getClass(),
|
||
|
|
]);
|
||
|
|
|
||
|
|
if (isPublic) {
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
// 对于需要认证的接口,使用 JWT 认证
|
||
|
|
const result = this.jwtAuthGuard.canActivate(context);
|
||
|
|
|
||
|
|
// 处理 Promise 类型
|
||
|
|
if (result instanceof Promise) {
|
||
|
|
return await result;
|
||
|
|
}
|
||
|
|
|
||
|
|
return result as boolean;
|
||
|
|
}
|
||
|
|
}
|