GraphQL如何处理权限和异常问题?

最近学习了一下GraphQL,借鉴lighthouse实现了GraphqQL Server,简单查询可以通过dbmodel指令处理,复杂查询通过自定义resolver处理。

例如:从数据库获取一条记录

getArticleByDb(
    id: Int! @eq
): CmsArticle
@db(name:  "cms_article")
@where(value: { status:  1 })
@find

Laravel
通过模型获取记录,查询条件由输入进行控制

getArticleByDb(
    id: Int! @eq
    status: Int = 1
): CmsArticle
@model(name:  "\\app\\cms\\model\\admin\\ArticleModel")
@where(value: { status:  ["=", "$status"] })
@find

Laravel
通过defer指令解决n+1问题

type CmsArticle {
    id: Int!
    category_id: Int!
    title: String!
    description: String!
    content: String!
    user_id: Int!
    status: Int!
    created_at_txt: String! @alias(key: created_at) @date(formatter: "Y-m-d H:i:s")
    category: CmsCategory @defer(resolver: "\\app\\graphql\\loaders\\Cms::getCategoryById", keys: "category_id")
}

遇到的问题

  1. 权限问题
    目前通过@auth(role: true)指令表示需要验证角色,后台为角色配置权限。
    Laravel
    type CmsArticle {
     ...
     title: String! @auth(role: true) 无权限则抛出异常
     # title: String! @auth(role: true, default: "") # 无权限则显示默认值
     ...
    }
    没有权限抛出异常
    Laravel
    请问各位佬有没有其他更好的处理方式?
  2. 如何处理错误码问题?
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

关于错误码,可以定义如下异常类,在业务中抛出异常throw new Exception($message, $code);

use GraphQL\Error\ClientAware;
use GraphQL\Error\Error;

class Exception extends Error implements ClientAware
{
    public function __construct(
        $message, 
        $code = 10000, 
        $source = null,
        array $positions = [],
        $path = null,
        $previous = null,
        array $extensions = []
    ) {
        $extends = [
            'code' => $code
        ];
        if (is_array($source)) $extends += $source;
        parent::__construct($message, null, null, [], null, null, $extends);
    }

    public function isClientSafe()
    {
        return true;
    }

    public function getCategory()
    {
        return 'Business Logic';
    }
}

响应错误中包含错误码

file

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!