Skip to content

授权守卫

正如前面提到的,授权是守卫的一个很好的用例,因为只有当调用者(通常是经过身份验证的特定用户)具有足够的权限时,特定的路由才可用。我们现在要构建的 AuthGuard 假设用户是经过身份验证的(因此,请求头附加了一个 token)。它将提取和验证 token,并使用提取的信息来确定请求是否可以继续。

auth.guard.ts

ts
import { Injectable, CanActivate, ExecutionContext } from 'http-typedi'


function validateRequest<T>(req: RequestConfig<T>): boolean | Promise<boolean> {
  // custom validation
  console.log(req, 'validateRequest')
  return req.method === RequestMethod.GET
}

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> {
    const request = context.switchToHttp().getRequest()
    return validateRequest(request)
  }
}

validateRequest() 函数中的逻辑可以根据需要变得简单或复杂。本例的主要目的是说明守卫如何适应请求/响应周期。

每个守卫必须实现一个 canActivate() 函数。此函数应该返回一个布尔值,用于指示是否允许当前请求。它可以同步或异步地返回响应通过 PromiseHttp-Typedi 使用返回值来控制下一个行为:

如果返回 true, 将处理用户调用。 如果返回 false, 则 Http-Typedi 将忽略当前处理的请求。