Nestjs + Passport:阻止用户1访问用户2的信息

问题描述 投票:0回答:3

如何防止用户 1 在 Nesjs 应用程序中使用护照访问用户 2 的信息?

我已经有 2 个策略:

  • 使用电子邮件/密码验证用户的本地策略。受此策略保护的路由返回一个 jwt 令牌。

  • 验证给定 jwt 令牌的 jwt 策略。

现在,我想将对

users/:id
等路由的访问限制为 jwt 令牌,该令牌实际上具有相同的 userId 加密。

如何做到这一点?

node.js authentication passport.js nestjs nestjs-passport
3个回答
5
投票

编辑

我混合了身份验证授权:一旦用户经过身份验证,我想要实现的是授权。

我必须使用 Guard:

自己的.guard.ts

@Injectable()
export class OwnGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const req = context.switchToHttp().getRequest();
    return req.user.id === req.params.id;
  }
}

然后在我的路线中使用它:

@Get(':id')
@UseGuards(OwnGuard)
async get(@Param('id') id: string) {
  return await this.usersService.get(id);
}

原答案

我所做的是基于 jwt 策略创建第三种策略:

@Injectable()
export class OwnStrategy extends PassportStrategy(Strategy, 'own') {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      secretOrKey: SECRET,
      passReqToCallback: true
    });
  }

  async validate(req: Request, payload: { sub: string }) {
    if (req.params.id !== payload.sub) {
      throw new UnauthorizedException();
    }
    return { userId: payload.sub };
  }
}

请注意我如何将自定义名称“own”作为

PassportStrategy
的第二个参数传递,以将其与“jwt”区分开来。它的守卫:

@Injectable()
export class OwnAuthGuard extends AuthGuard('own') {}

这可行,但我想知道这是否是这样做的好方法...

如果以后我想为管理员用户进行用户修改怎么办?

我应该创建第四个策略来检查是否

role === Role.ADMIN || req.params.id === payload.sub

我想我错过了一些东西。应该有一种方法来创建一种策略,该策略仅验证 jwt,另一个仅验证 userId,另一个仅验证角色,并在将防护应用于我的路线时按照我想要的方式组合它们。


1
投票

同样的情况。你可以在guard中使用

handleRequest
方法。

在这里您可以访问用户身份验证和请求,然后对适当的资源进行验证。查看我的代码

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
    canActivate(context: ExecutionContext) {
        return super.canActivate(context);
    }

    handleRequest(err, user, info, context: ExecutionContext) {
        const request = context.switchToHttp().getRequest<Request>();
        const params = request.params;
        if (user.id !== +params.id) {
            throw new ForbiddenException();
        }

        return user;
    }
}

在此处查看更多内容https://docs.nestjs.com/security/authentication#extending-guards


0
投票

Guards 根据我们提供的条件来确定路由是否可以处理请求。它用于所有授权中,以确定请求是否被允许。

使用基本的基于角色的访问控制(RBAC)是 NestJS 中最简单的授权方法,也是推荐的。

您还可以使用基于声明、集成 CASL 和策略防护来实施。

有关 NestJS 的更多信息 授权

© www.soinside.com 2019 - 2024. All rights reserved.