Nest.js 中如何在控制器级别应用守卫?

推荐答案

在 Nest.js 中,可以通过在控制器类或方法上使用 @UseGuards() 装饰器来应用守卫。守卫可以用于控制器级别,以保护整个控制器中的所有路由,或者用于特定的路由方法。

在控制器级别应用守卫

-- -------------------- ---- -------
------ - ----------- ---- --------- - ---- -----------------
------ - --------- - ---- ---------------

----------------------
---------------------
------ ----- ----------------- -
  ------
  ---------- ------ -
    ------ ----- ----- -- --------- -- --- -----------
  -
-

在这个例子中,AuthGuard 被应用到了 ExampleController 控制器中的所有路由上。这意味着,任何访问 example 路由的请求都会经过 AuthGuard 的检查。

在方法级别应用守卫

-- -------------------- ---- -------
------ - ----------- ---- --------- - ---- -----------------
------ - --------- - ---- ---------------

----------------------
------ ----- ----------------- -
  ------
  ---------------------
  ---------- ------ -
    ------ ----- ----- -- --------- -- --- -----------
  -
-

在这个例子中,AuthGuard 只被应用到了 findAll 方法上。这意味着,只有访问 example 路由的 GET 请求会经过 AuthGuard 的检查。

本题详细解读

守卫的作用

守卫(Guards)在 Nest.js 中主要用于请求的权限验证。它们可以决定一个请求是否应该被处理或拒绝。守卫通常用于实现身份验证和授权逻辑。

@UseGuards() 装饰器

@UseGuards() 是 Nest.js 提供的一个装饰器,用于将守卫应用到控制器或方法上。它可以接受一个或多个守卫类作为参数。这些守卫类必须实现 CanActivate 接口。

守卫的实现

一个典型的守卫类如下所示:

-- -------------------- ---- -------
------ - ----------- ------------ ---------------- - ---- -----------------
------ - ---------- - ---- -------

-------------
------ ----- --------- ---------- ----------- -
  ------------
    -------- -----------------
  -- ------- - ---------------- - ------------------- -
    ----- ------- - ------------------------------------
    -- -----------
    ------ ----- -- - -----
  -
-

canActivate 方法是守卫的核心,它返回一个布尔值或一个解析为布尔值的 PromiseObservable。如果返回 true,请求将继续;如果返回 false,请求将被拒绝。

控制器级别与方法级别的区别

  • 控制器级别:当守卫应用到控制器级别时,控制器中的所有路由都会受到该守卫的保护。
  • 方法级别:当守卫应用到方法级别时,只有特定的路由方法会受到该守卫的保护。

使用场景

  • 控制器级别:适用于整个控制器中的所有路由都需要相同的权限验证逻辑的场景。
  • 方法级别:适用于某些路由需要特定的权限验证逻辑,而其他路由不需要的场景。

通过合理使用守卫,可以有效地控制请求的访问权限,确保系统的安全性。

纠错
反馈