在HotChocolate中是否可以使用自定义服务实现授权校验?
首先明确:官方默认的Authorize方法没有提供直接接收布尔值的重载,你想要的调用方式没办法直接用原生方法实现,但可以通过自定义扩展的方式快速实现你的需求,改造成本极低。
实现方案1(完全匹配你想要的调用形式)
你可以给descriptor对应的类型写一个自定义扩展方法,直接接收布尔类型的授权结果,内部自己处理授权失败的逻辑即可:
// 自定义扩展方法,注意把参数里的EndpointDescriptor换成你实际的descriptor类型 public static class AuthorizationExtensions { public static void Authorize(this EndpointDescriptor descriptor, bool isAuthorized) { if (!isAuthorized) { // 这里按你的业务需求处理授权失败逻辑,比如抛未授权异常、给descriptor加拒绝标记等 throw new UnauthorizedAccessException("当前用户无操作权限"); } } }
扩展方法定义完成后,你就可以直接使用你写的调用形式:
bool isAuthorized = _permissionService.Authorize("Admin"); descriptor.Authorize(isAuthorized);
实现方案2(更符合框架规范的集成方式)
如果你不想提前计算授权结果,也可以直接把你的自定义权限服务集成到官方授权管道中,自定义授权逻辑后,你可以直接沿用官方的调用写法,底层自动走你自己的权限校验规则:
// 自定义授权逻辑后,调用写法和官方一致,底层自动调用你的PermissionService descriptor.Authorize("Admin");
这种方案的优势是不需要你在每个授权位置手动调用权限服务,框架会自动触发校验,统一管理更方便。
内容的提问来源于stack exchange,提问作者Bye
相关产品推荐
相关产品推荐

