注:この記事は、nestjsを初めて学習した後のブロガーの知識と理解のみを記録しています。経験はまだ浅く、記事の内容は参照用です。エラーがあれば訂正してください。
側面として
この記事では一時的に詳細については説明しません
1.アスペクトタイプ:CanActivateインターフェイス実装クラス
2.アスペクト入力
ExecutionContextオブジェクト:パラメータホストオブジェクトに継承された実行コンテキストオブジェクトArgumentsHost
この記事の焦点はExecutionContextオブジェクトではないため、ここでは詳しく説明しません。
export interface ExecutionContext extends ArgumentsHost {
getClass<T = any>(): Type<T>;
getHandler(): Function;
}
3.アスペクト出力:要求を続行するか、応答を返します
- ブール値を返す| 約束| 観察可能
4.使用シナリオの側面
- 権限管理
権利管理事件
権限管理は、ガードテクノロジーによって実現できます。名前が示すように、ガードは認証を担当できます。権限に準拠する要求は通過し、準拠しない要求は直接応答します。
1.権限をコントローラーにバインドします(パスルールをドアに添付します)
- カスタムメタデータデコレータ
// 自定义权限装饰器,@SetMetadata()装饰器拥有将定制元数据附加到路由处理程序的能力,可用于控制器绑定权限以便读取
import {
SetMetadata } from '@nestjs/common';
export const Roles = (...roles: string[]) => SetMetadata('roles', roles);
- メタデータデコレータを使用する
@Post()
// @SetMetadata('roles', ['admin']) // 方式1:使用@SetMetadata装饰器
@Roles('admin') // 方式2:使用自定义装饰器封装@SetMetadata装饰器
async create(@Body() createCatDto: CreateCatDto) {
this.catsService.create(createCatDto);
}
2.ガードをコントローラーにバインドします(ガードをドアに割り当てます)
- 保護者の定義
import {
Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import {
Reflector } from '@nestjs/core';
@Injectable()
export class RolesGuard implements CanActivate {
constructor(private reflector: Reflector) {
}
canActivate(context: ExecutionContext): boolean {
const roles = this.reflector.get<string[]>('roles', context.getHandler());
if (!roles) {
return true;
}
const request = context.switchToHttp().getRequest();
const user = request.user;
return matchRoles(roles, user.roles);
}
}
- バインドされた保護者
// 方式1:方法守卫(controller上)
@UseGuards(new RolesGuard())
// 方式2:全局守卫(app.module.ts)
@Module({
providers: [
{
provide: APP_GUARD,
useClass: RolesGuard,
},
],
})
3.ガード認証に失敗しました(ガードフォークとナイフで停止)
- デフォルトの応答
{
"statusCode": 403,
"message": "Forbidden resource"
}
- カスタムレスポンス
// 守卫者抛出异常
throw new UnauthorizedException();