Javascript 键入GraphQL:允许文档所有者和管理员/版主使用@Authorized()decorator进行访问
详细信息 我使用的是graphql类型,并试图使用Javascript 键入GraphQL:允许文档所有者和管理员/版主使用@Authorized()decorator进行访问,javascript,typescript,graphql,typegraphql,Javascript,Typescript,Graphql,Typegraphql,详细信息 我使用的是graphql类型,并试图使用@Authorized()装饰器和自定义身份验证检查器作为防护,限制特定用户组的数据访问或操作。根据装饰师的说法,一切正常,访问被适当阻止/允许 问题 我希望文档的所有者/作者能够编辑/删除它,即使其标记为@Authorized([“版主”,“管理员]),或者我可以使用类似@Authorized([“所有者”,“版主”,“管理员])的标记,如果这样更容易实现的话 据我所知,我没有任何关于用户试图在身份验证检查器中访问哪个模型/文档的信息,只有变异
@Authorized()
装饰器和自定义身份验证检查器作为防护,限制特定用户组的数据访问或操作。根据装饰师的说法,一切正常,访问被适当阻止/允许
问题
我希望文档的所有者/作者能够编辑/删除它,即使其标记为@Authorized([“版主”,“管理员])
,或者我可以使用类似@Authorized([“所有者”,“版主”,“管理员])
的标记,如果这样更容易实现的话
据我所知,我没有任何关于用户试图在身份验证检查器中访问哪个模型/文档的信息,只有变异的参数。换句话说,我有他们想要访问的ID,但不是它所属的模型
问题
是否有任何方法可以在身份验证检查器中检查用户是否拥有该文档,或者我是否必须将其标记为@Authorized()
,并检查用户是否拥有该文档,或者是否在每次更改/查询中都是管理员/版主
代码
索引d.ts
声明模块“type graphql”{
函数Authorized():MethodAndPropDecorator;
已授权的功能(角色:AccessLevels[]):MethodAndPropDecorator;
功能授权(…角色:AccessLevels[]):MethodAndPropDecorator;
}
类型.ts
键入AccessLevels=“版主”|“管理员”;
authChecker.ts
const-authChecker:authChecker=({context},角色):boolean=>{
如果(!context.user){
返回false;
}
if(roles.length==0){
返回true;
}
if(context.user.accessLevel>0&&roles.includes(“主持人”)){
返回true;
}
返回context.user.accessLevel>1&&roles.includes(“ADMIN”);
};
机构解析程序
@Authorized([“版主”,“管理员])
@突变(()=>EstablishmentType,{description:“按ID删除一个机构”})
异步删除建立(@Args(){id}:建立IDarg):承诺{
const-assistation=await-assistation.findOne({where:{id}});
如果(!建立){
抛出新错误(“建立不存在”);
}
等待建立;
返回机构;
}
尝试修改签名和逻辑,以允许将回调传递到装饰器,从而解决“所有者”条件:
@ObjectType
class User {
@Authorized({
roles: ["MODERATOR", "ADMIN"],
owner: ({ root, context }) => {
return root.id === context.user.id;
},
})
@Field()
email: string;
}
请注意,您不能总是在authChecker或中间件中这样做,因为它们在解析程序代码之前运行,因此在DeleteEstablish
的情况下,没有通用的方法将establishmentId
与user.id
匹配以检测它是否是所有者