守卫
loginGuard
import { CanActivate, ExecutionContext, Injectable, UnauthorizedException } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { JwtService } from '@nestjs/jwt';
import { FastifyRequest } from 'fastify';
import { Observable } from 'rxjs';
@Injectable()
export class LoginGuard implements CanActivate {
constructor(
private readonly reflector: Reflector,
private readonly jwtService: JwtService,
) { }
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const request: FastifyRequest = context.switchToHttp().getRequest();
const notRequireLogin = this.reflector.getAllAndOverride('not-require-login', [
context.getClass(),
context.getHandler()
]);
if (notRequireLogin) return true
const authorization = request.headers.authorization;
if (!authorization) {
throw new UnauthorizedException('用户未登录');
}
try {
const verifyUser = this.jwtService.verify(authorization);
if (verifyUser && request.body) {
(request.body as any).userId = verifyUser.userId;
}
return true;
} catch (e) {
throw new UnauthorizedException('token失效,请重新登录');
}
}
}
@Post("register")
@SetMetadata('not-require-login', true)
permissionGuard
import { CanActivate, ExecutionContext, ForbiddenException, Injectable } from '@nestjs/common';
import { Reflector } from '@nestjs/core';
import { JwtService } from '@nestjs/jwt';
import { isArray } from 'class-validator';
import { FastifyRequest } from 'fastify';
import { Observable } from 'rxjs';
@Injectable()
export class PermissionGuard implements CanActivate {
constructor(
private readonly reflector: Reflector,
private readonly jwtService: JwtService,
) { }
canActivate(
context: ExecutionContext,
): boolean | Promise<boolean> | Observable<boolean> {
const request: FastifyRequest = context.switchToHttp().getRequest();
const requiredPermissions = this.reflector.getAllAndOverride('require-permission', [
context.getClass(),
context.getHandler()
]);
if (!requiredPermissions || !isArray(requiredPermissions) || requiredPermissions.length < 1) return true;
const authorization = request.headers.authorization;
if (authorization) {
const userPermissions = this.jwtService.verify(authorization)?.permissions;
if (userPermissions && isArray(userPermissions) && userPermissions.length > 0) {
if (requiredPermissions.every(item => userPermissions.includes(item))) {
return true
} else {
throw new ForbiddenException("用户没有权限")
}
} else {
throw new ForbiddenException("用户没有权限")
}
} else {
throw new ForbiddenException("用户没有权限")
}
}
}
@ApiTags('角色管理')
@Controller('role')
@SetMetadata('require-permission', ['superAdmin'])
export class RoleController {
注册guard
{
provide: APP_GUARD,
useClass: LoginGuard
},
{
provide: APP_GUARD,
useClass: PermissionGuard
}