nest/nestjs自定义守卫拿不到request.user的值,context.switchToHttp().getRequest()拿不到上一个守卫挂载在req的数据

发现原因是@UseGuards使用错误,不要使用2个@UseGuards装饰器,而是像下面这样使用才正确。
  @UseGuards(JwtAuthGuard, RoleGuard)
  @Post()
  create(@Body() createCategoryDto: CreateCategoryDto) {
    return this.categoriesService.create(createCategoryDto);
  }

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
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` 异常。 总的来说,自定义守卫自定义本地策略都是用于保护路由的工具。自定义守卫用于检查请求对象中的信息,以确定用户是否可以访问该路由。自定义本地策略用于验证用户凭据,并返回用户对象。您可以根据您的需求选择使用其中的一个或两个。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学途路漫漫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值