gpt4 book ai didi

javascript - 类型-GraphQL : Allow document owner and admin/moderator access with the @Authorized() decorator

转载 作者:行者123 更新时间:2023-12-02 20:57:45 26 4
gpt4 key购买 nike

详细信息

我正在使用 type-graphql 并尝试使用 @Authorized() 装饰器和自定义身份验证检查器作为保护来限制特定用户组的数据访问或操作。一切正常,并且根据装饰器适本地阻止/允许访问。

问题

我希望文档的所有者/作者能够编辑/删除它,即使其标记有 @Authorized(["MODERATOR", "ADMIN"]) (可选)我可以标记它类似 @Authorized(["OWNER", "MODERATOR", "ADMIN"]) 的内容(如果这样更容易实现)。

据我所知,我没有任何关于用户试图在身份验证检查器中访问什么模型/文档的信息,只有突变的参数。换句话说,我有他们想要访问的内容的 ID,但没有它所属的模型。

问题

有什么方法可以检查用户是否在身份验证检查器中拥有该文档,或者我是否必须将其标记为 @Authorized() 并检查用户是否拥有该文档或者是每个突变/查询中的管理员/主持人?

代码

索引.d.ts

declare module "type-graphql" {
function Authorized(): MethodAndPropDecorator;
function Authorized(roles: AccessLevels[]): MethodAndPropDecorator;
function Authorized(...roles: AccessLevels[]): MethodAndPropDecorator;
}

类型.ts

type AccessLevels = "MODERATOR" | "ADMIN";

authChecker.ts

const authChecker: AuthChecker<{ user: User | null }, AccessLevels> = ({ context }, roles): boolean => {
if (!context.user) {
return false;
}

if (roles.length === 0) {
return true;
}

if (context.user.accessLevel > 0 && roles.includes("MODERATOR")) {
return true;
}

return context.user.accessLevel > 1 && roles.includes("ADMIN");
};

EstablishmentResolver.ts

@Authorized(["MODERATOR", "ADMIN"])
@Mutation(() => EstablishmentType, { description: "Deletes a establishment by ID" })
async deleteEstablishment(@Args() { id }: EstablishmentIdArg): Promise<Establishment> {
const establishment = await Establishment.findOne({ where: { id } });

if (!establishment) {
throw new Error("Establishment does not exist");
}

await establishment.destroy();

return establishment;
}

最佳答案

尝试修改签名和逻辑以允许将回调传递到装饰器中,这将解决“所有者”条件:

@ObjectType
class User {
@Authorized({
roles: ["MODERATOR", "ADMIN"],
owner: ({ root, context }) => {
return root.id === context.user.id;
},
})
@Field()
email: string;
}

请注意,您不能总是在 authChecker 或中间件内执行此操作,因为它们在解析器代码之前运行,因此在 deleteEstablishment 的情况下,没有通用的方法来匹配 estinationIduser.id 来检测它是否是所有者。

关于javascript - 类型-GraphQL : Allow document owner and admin/moderator access with the @Authorized() decorator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61430640/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com