Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 键入GraphQL:允许文档所有者和管理员/版主使用@Authorized()decorator进行访问_Javascript_Typescript_Graphql_Typegraphql - Fatal编程技术网

Javascript 键入GraphQL:允许文档所有者和管理员/版主使用@Authorized()decorator进行访问

Javascript 键入GraphQL:允许文档所有者和管理员/版主使用@Authorized()decorator进行访问,javascript,typescript,graphql,typegraphql,Javascript,Typescript,Graphql,Typegraphql,详细信息 我使用的是graphql类型,并试图使用@Authorized()装饰器和自定义身份验证检查器作为防护,限制特定用户组的数据访问或操作。根据装饰师的说法,一切正常,访问被适当阻止/允许 问题 我希望文档的所有者/作者能够编辑/删除它,即使其标记为@Authorized([“版主”,“管理员]),或者我可以使用类似@Authorized([“所有者”,“版主”,“管理员])的标记,如果这样更容易实现的话 据我所知,我没有任何关于用户试图在身份验证检查器中访问哪个模型/文档的信息,只有变异

详细信息

我使用的是graphql类型,并试图使用
@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
匹配以检测它是否是所有者