Movatterモバイル変換


[0]ホーム

URL:


Skip to content
DEV Community
Log in Create account

DEV Community

Stanislav Karol
Stanislav Karol

Posted on

     

NestJS: Получить текущего пользователя когда не подключён AuthGuard

Я хочу, чтобы GET-запрос работал для всех пользователей: авторизованных и анонимных. Но мне бы хотелось, чтобы ответ авторизованному пользователю ещё дополнялся некоей дополнительной информацией. Например, заметку может получить анонимный пользователь, а зарегистрированный пользователь ещё получит информацию о статусе этой заметке: Она в избранном, автор у пользователя в друзьях и т.п.
На момент написания этой заметки у NestJS для этого функционала нет настроек. Но их можно написать самому. Я предлагаю на мой взгляд простое решение.
Сперва вводная часть: Авторизация у меня проходит при помощиjwt, поэтому в проекте обязательно должны быть сделанырекомендованные шаги(переписывать их сюда я не стал). Вот только AuthGuard(по ссылке это класс JwtAuthGuard) должен быть другим. В поставленной задаче намне нужно выбрасывать ошибку, так что если пользователь не авторизован, то вместо его id, email или что там у Вас в токене зашифровано, можно вернутьnull.
Вот реализация этого:
jwt.guard.ts

import{Injectable}from'@nestjs/common';import{AuthGuard}from'@nestjs/passport';@Injectable()exportclassJwtAuthGuardextendsAuthGuard('jwt'){}/** * Неавторизованные пользователи могут воспользоваться службой. * При этом user будет равен null */@Injectable()exportclassAllowNullUserGuardextendsAuthGuard('jwt'){handleRequest(err,user){// Если пользователь на авторизован, то user = nullreturnuser||null;}}
Enter fullscreen modeExit fullscreen mode
  • JwtAuthGuard - это обычный guard, который следит за тем, чтобы неавторизованный пользователь не прошёл.
  • AllowNullUserGuard - это кастомный guard, который не будет выбрасывать ошибку, если пользователь не авторизовался, а будет выдавать null.Использование его в деле может быть например таким:
@Get(':slug')@UseGuards(AllowNullUserGuard)asyncgetSingleArticle(@Param('slug')slug:string,@User()currentUser:UserEntity|null,){returncurrentUser;}
Enter fullscreen modeExit fullscreen mode

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

import{createParamDecorator,ExecutionContext}from'@nestjs/common';import{ExpressRequest}from'@app/types/expressRequest.interface';exportconstUser=createParamDecorator((data:any,ctx:ExecutionContext)=>{constrequest=ctx.switchToHttp().getRequest<ExpressRequest>();if(!request.user)returnnull;if(data){returnrequest.user[data];}returnrequest.user;});
Enter fullscreen modeExit fullscreen mode

Top comments(0)

Subscribe
pic
Create template

Templates let you quickly answer FAQs or store snippets for re-use.

Dismiss

Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment'spermalink.

For further actions, you may consider blocking this person and/orreporting abuse

Веб-разработчик.
  • Location
    Russia, Moscow
  • Joined

More fromStanislav Karol

DEV Community

We're a place where coders share, stay up-to-date and grow their careers.

Log in Create account

[8]ページ先頭

©2009-2025 Movatter.jp