nestjs 策略和守卫
时间: 2024-02-14 21:23:25 浏览: 19
NestJS中的策略和守卫是用于在应用程序中实现身份验证和授权的两个重要组件。
策略是一种可重用的模块,用于定义某个资源的访问规则。它们可以被应用于整个应用程序或单个路由,以确保只有经过身份验证并具有适当权限的用户才能访问受保护的资源。策略可以使用自定义逻辑来检查用户的身份验证状态和访问权限。
守卫是一种守卫路由或特定端点的中间件,用于检查请求是否满足某些条件。它们提供了更细粒度的控制,可以在处理请求之前或之后拦截请求。它们可以与策略结合使用,以确保只有经过身份验证和授权的用户才能访问受保护的资源。
在 NestJS中,可以使用@nestjs/passport库来实现策略和守卫。它支持多种身份验证策略,包括本地身份验证、OAuth、JWT等等。可以通过将策略和守卫应用于路由或控制器来保护应用程序中的任何资源。
相关问题
nestjs 自定义守卫和自定义本地策略有什么不同
NestJS 中的自定义守卫和自定义本地策略都是用于保护路由的工具,但它们的工作方式略有不同。
自定义守卫是一个类,它实现 `CanActivate` 接口并包含一个名为 `canActivate` 的方法。在 `canActivate` 方法中,您可以编写逻辑来检查用户是否可以访问该路由。如果 `canActivate` 方法返回 `true`,则表示用户可以访问该路由。如果方法返回 `false` 或抛出异常,则表示用户无法访问该路由。
以下是一个示例自定义守卫:
```typescript
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
@Injectable()
export class MyGuard implements CanActivate {
canActivate(context: ExecutionContext) {
const request = context.switchToHttp().getRequest();
return request.user && request.user.role === 'admin';
}
}
```
在上面的代码中,我们定义了一个名为 `MyGuard` 的自定义守卫。在 `canActivate` 方法中,我们检查请求对象中的用户对象是否存在,并且用户具有 `admin` 角色。如果这些条件都为真,则返回 `true`,表示用户可以访问该路由。否则,返回 `false`。
自定义本地策略是一个类,它实现 `PassportStrategy` 接口并包含一个名为 `validate` 的方法。在 `validate` 方法中,您可以编写逻辑来验证用户凭据并返回用户对象。如果用户凭据有效,则返回用户对象。如果凭据无效,则抛出异常。
以下是一个示例自定义本地策略:
```typescript
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-local';
import { AuthService } from './auth.service';
@Injectable()
export class MyStrategy extends PassportStrategy(Strategy) {
constructor(private readonly authService: AuthService) {
super();
}
async validate(username: string, password: string) {
const user = await this.authService.validateUser(username, password);
if (!user) {
throw new UnauthorizedException();
}
return user;
}
}
```
在上面的代码中,我们定义了一个名为 `MyStrategy` 的自定义本地策略。在 `validate` 方法中,我们调用 `AuthService` 中的 `validateUser` 方法来验证用户凭据。如果凭据有效,则返回用户对象。否则,抛出 `UnauthorizedException` 异常。
总的来说,自定义守卫和自定义本地策略都是用于保护路由的工具。自定义守卫用于检查请求对象中的信息,以确定用户是否可以访问该路由。自定义本地策略用于验证用户凭据,并返回用户对象。您可以根据您的需求选择使用其中的一个或两个。
nestjs 如何设置全局守卫 使用不同策略
在 NestJS 中,可以使用全局守卫来对所有请求进行预处理,比如校验请求的有效性、鉴权等。要设置全局守卫并使用不同的策略,可以参考以下步骤:
1. 创建守卫:首先,在项目中创建一个守卫类,该类需要实现 CanActivate 接口。可以根据需要创建多个守卫类,每个守卫类对应一种策略。
```typescript
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
@Injectable()
export class AuthGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
// 在这里实现鉴权逻辑
return true;
}
}
@Injectable()
export class RoleGuard implements CanActivate {
canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
// 在这里实现角色校验逻辑
return true;
}
}
```
2. 注册守卫:在应用模块中,使用 `useGlobalGuards` 方法注册守卫。可以传入一个或多个守卫类,表示使用不同的策略。
```typescript
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { AuthGuard, RoleGuard } from './guards';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes('*');
}
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes('*');
}
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes('*');
}
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes('*');
}
configure(consumer: MiddlewareConsumer) {
consumer
.apply(LoggerMiddleware)
.forRoutes('*');
}
// 注册全局守卫
configure(consumer: MiddlewareConsumer) {
consumer
.apply(AuthGuard, RoleGuard)
.forRoutes('*');
}
}
```
这样就可以根据不同的策略设置不同的全局守卫。在请求处理过程中,每个守卫类的 `canActivate` 方法都会被调用,可以根据实际情况实现不同的逻辑。