我使用NestJS作为客户端API的框架。在框架内,我们使用的是相当不错的标准Passport / JWT auth基础结构。找到承载 token 后,我们的AuthGuard将触发,并且在安全的API端点中,我可以通过'@Res()request'注入(inject)HTTP上下文,并访问'request.user'属性,该属性包含我的Jwt token 的有效负载。

最重要的是,我们试图以与文档中提供的示例代码以及GitHub上的一些示例项目所提供的示例代码非常相似的方式实现“RolesGuard”(没有一个实际上使用此防护,但它们将其包含为示例防护) )。

我们的问题是我们的AuthGuard会触发并验证Jwt token ,然后我们的RolesGuard会触发,但是传递给它的请求对象没有附加到请求的用户元数据。

我们的RolesGuard中的关键代码是:

    const request = context.switchToHttp().getRequest();
    const user = request.user;

    if (!user) {
        return false;
    }

在上面的内容中,用户总是错误的。是否有人在Nest中编写了基于角色/权限的防护措施,从而成功访问了当前用户的范围?所有代码都在触发,所有内容似乎都已正确注册。

-凯文

最佳答案

最终,这似乎是警卫人员的订购问题,而且看起来不容易解决(没有框架允许对订购进行某些控制)。

我希望在全局范围内注册RolesGuard,但这会导致它首先被注册并首先被启动。

@UseGuards(AuthGuard('jwt'), RolesGuard)
@Roles('admin')

如果我在端点级别注册它,然后将其放在AuthGuard之后,则它会第二次触发,并且我会在Guard自身中获得期望的用户上下文。它不是完美的,但可以。

-凯文

10-06 04:26