微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 graphql 在 Nestjs 中授权

如何解决使用 graphql 在 Nestjs 中授权

我已经开始学习 nestjs、express 和 graphql。 我在尝试授权使用 jwt 令牌进行身份验证的用户访问时遇到问题。 我遵循了 Nestjs website 上的身份验证教程。 我能够获取当前用户,但是当我尝试实现 basic role base access control 时,我无法在 canActivate 方法中访问当前用户。 我认为是因为在 Graphql Guard 之前执行了 Roles Guard。

我会把代码在这里

gql-auth.guard.ts

import { ExecutionContext } from "@nestjs/common";
import { GqlExecutionContext } from "@nestjs/graphql";
import { AuthGuard } from "@nestjs/passport";

export class GqlAuthGuard extends AuthGuard("jwt") {
    getRequest(context: ExecutionContext) {
        const ctx = GqlExecutionContext.create(context);
        console.log("gql simple context: ",context);
        console.log("gqlContext: ",ctx.getContext());
        return ctx.getContext().req;
    }
}

roles.guard.ts

import { CanActivate,ExecutionContext,Injectable } from "@nestjs/common";
import { Reflector } from "@nestjs/core";
import { GqlExecutionContext } from "@nestjs/graphql";

@Injectable()
export class RolesGuard implements CanActivate {
    constructor(private reflector: Reflector) {}

    canActivate(context: ExecutionContext) {
        const roles = this.reflector.get<string[]>("roles",context.getHandler());
        const ctx = GqlExecutionContext.create(context);
        console.log("roles: ",roles);
        console.log("context: ",context.switchToHttp().getRequest());
        console.log("gqlContext: ",ctx.getContext().req);

        return true;
    }
}

jwt.strategy.ts

import { Injectable } from "@nestjs/common";
import { PassportStrategy } from "@nestjs/passport";
import { ExtractJwt,Strategy } from "passport-jwt";
import { jwtConstants } from "../constants";

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
    constructor() {
        super({
            jwtFromrequest: ExtractJwt.fromAuthHeaderAsBearerToken(),ignoreExpiration: false,secretorKey: jwtConstants.secret,});
    }

    validate(payload: any) {
        console.log("payload: ",payload);

        return payload;
    }
}

解析器

@UseGuards(GqlAuthGuard)
@Roles("ADMIN")
@UseGuards(RolesGuard)
@Query((returns) => [Specialty],{ nullable: "itemsAndList",name: "specialties" })
async getSpecialties(@Args() params: FindManySpecialtyArgs,@Info() info: GraphQLResolveInfo) {
    const select = new prismaSelect(info).value;
    params = { ...params,...select };
    return this.prismaService.specialty.findMany(params);
}

以前有人成功实施过吗?

解决方法

您应该在同一个 @UseGuards() 装饰器中使用这两个守卫。喜欢@UseGuards(GqlAuthGuard,RolesGuard)。 Nest 将按顺序运行这些程序,不会出现问题。

,
export const Authorize = (roles?: string | string[]) =>
  applyDecorators(
    SetMetadata('roles',[roles].flat()),UseGuards(GqlAuthGuard,RolesGuard),);
@Authorize("ADMIN")
@Query((returns) => [Specialty],{ nullable: "itemsAndList",name: "specialties" })
async getSpecialties(@Args() params: FindManySpecialtyArgs,@Info() info: GraphQLResolveInfo) {
    const select = new PrismaSelect(info).value;
    params = { ...params,...select };
    return this.prismaService.specialty.findMany(params);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?