NestJS: AuthGuard を使用しないでください.


Я хочу, чтобы GET-запрос работал для всех пользователей: авторизованных および анонимных.私はあなたのことを知っていて、私はあなたのことを知っていました. Например, заметку может получить анонимный пользователь, а зарегистрированный пользователь ещё получит информацию о статусе этой заметке: Она в избранном, автор у пользователя в друзьях и т.п.
これは、NestJS を使用することをお勧めします. Но их можно написать самому. Я предлагаю на мой взгляд простое решение.
Сперва вводная часть: Авторизация у меня проходит при помощи jwt , поэтому в проекте обязательно должны быть сделаны рекомендованные шаги (переписывать их сюда я не стал). AuthGuard (JwtAuthGuard を追加) を追加しました. В поставленной задаче нам не нужно выбрасывать ошибку, так что если пользователь не авторизован, то вместо его id, email или что там у Вас в токене зашифровано, можно вернуть null.
タイトル:
jwt.guard.ts

import { Injectable } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}

/**
 * Неавторизованные пользователи могут воспользоваться службой.
 * При этом user будет равен null
 */
@Injectable()
export class AllowNullUserGuard extends AuthGuard('jwt') {
  handleRequest(err, user) {
    // Если пользователь на авторизован, то user = null
    return user || null;
  }
}



  • JwtAuthGuard - 保護されたガードであり、保護されていない保護機能です.

  • AllowNullUserGuard - ガードを保護し、null を保護し、null を保護します.
    この記事の内容は次のとおりです.

  •   @Get(':slug')
      @UseGuards(AllowNullUserGuard)
      async getSingleArticle(
        @Param('slug') slug: string,
        @User() currentUser: UserEntity | null,
      ) {
        return currentUser;
      }
    


    Здесь используется декоратор @User :

    import { createParamDecorator, ExecutionContext } from '@nestjs/common';
    
    import { ExpressRequest } from '@app/types/expressRequest.interface';
    
    export const User = createParamDecorator((data: any, ctx: ExecutionContext) => {
      const request = ctx.switchToHttp().getRequest<ExpressRequest>();
      if (!request.user) return null;
    
      if (data) {
        return request.user[data];
      }
      return request.user;
    });