推荐答案
在 Nest.js 中,可以通过在控制器类或方法上使用 @UseGuards()
装饰器来应用守卫。守卫可以用于控制器级别,以保护整个控制器中的所有路由,或者用于特定的路由方法。
在控制器级别应用守卫
-- -------------------- ---- ------- ------ - ----------- ---- --------- - ---- ----------------- ------ - --------- - ---- --------------- ---------------------- --------------------- ------ ----- ----------------- - ------ ---------- ------ - ------ ----- ----- -- --------- -- --- ----------- - -
在这个例子中,AuthGuard
被应用到了 ExampleController
控制器中的所有路由上。这意味着,任何访问 example
路由的请求都会经过 AuthGuard
的检查。
在方法级别应用守卫
-- -------------------- ---- ------- ------ - ----------- ---- --------- - ---- ----------------- ------ - --------- - ---- --------------- ---------------------- ------ ----- ----------------- - ------ --------------------- ---------- ------ - ------ ----- ----- -- --------- -- --- ----------- - -
在这个例子中,AuthGuard
只被应用到了 findAll
方法上。这意味着,只有访问 example
路由的 GET
请求会经过 AuthGuard
的检查。
本题详细解读
守卫的作用
守卫(Guards)在 Nest.js 中主要用于请求的权限验证。它们可以决定一个请求是否应该被处理或拒绝。守卫通常用于实现身份验证和授权逻辑。
@UseGuards()
装饰器
@UseGuards()
是 Nest.js 提供的一个装饰器,用于将守卫应用到控制器或方法上。它可以接受一个或多个守卫类作为参数。这些守卫类必须实现 CanActivate
接口。
守卫的实现
一个典型的守卫类如下所示:
-- -------------------- ---- ------- ------ - ----------- ------------ ---------------- - ---- ----------------- ------ - ---------- - ---- ------- ------------- ------ ----- --------- ---------- ----------- - ------------ -------- ----------------- -- ------- - ---------------- - ------------------- - ----- ------- - ------------------------------------ -- ----------- ------ ----- -- - ----- - -
canActivate
方法是守卫的核心,它返回一个布尔值或一个解析为布尔值的 Promise
或 Observable
。如果返回 true
,请求将继续;如果返回 false
,请求将被拒绝。
控制器级别与方法级别的区别
- 控制器级别:当守卫应用到控制器级别时,控制器中的所有路由都会受到该守卫的保护。
- 方法级别:当守卫应用到方法级别时,只有特定的路由方法会受到该守卫的保护。
使用场景
- 控制器级别:适用于整个控制器中的所有路由都需要相同的权限验证逻辑的场景。
- 方法级别:适用于某些路由需要特定的权限验证逻辑,而其他路由不需要的场景。
通过合理使用守卫,可以有效地控制请求的访问权限,确保系统的安全性。