一、數據建模

數據建模是構建授權系統的基礎,它決定了授權規則的設計方式。

示例:一個應用允許用戶查看公共數據和私人數據。此時,數據模型需定義表字段及其關系,以便授權系統區分不同訪問權限。


二、角色與屬性

常用的授權建模方法有兩種:

通過角色與屬性建模,應用程序可以實現靈活的授權規則。


三、嵌套規則

GraphQL 查詢通常包含嵌套字段,可能跨越多個數據源,授權邏輯需在所有嵌套層級動態應用。

示例查詢

query {
  用戶 {
    id
    名稱
    訂單 {
      id
      order_total
    }
  }
}

授權規則需同時適用于用戶和訂單字段,實現復雜且容易出錯。


四、性能優化與謂詞下推

在自定義 GraphQL 服務器中,授權檢查通常在數據獲取后進行,可能導致額外的數據處理和性能下降。

謂詞下推 是一種優化方法,將授權規則直接應用到數據庫查詢中。例如,僅查詢當前用戶的訂單數據,從而減少額外處理并提升安全性。


五、為何授權層復雜?

在自定義 GraphQL 中,授權邏輯可能存在多種實現方式:

每個字段都需授權時,解析器級授權會產生大量樣板代碼;模式級授權更靈活,但設計和實現更復雜。


六、通過上下文構建授權邏輯

GraphQL 通常使用 Context 對象傳遞身份驗證和授權信息。

JWT 令牌驗證示例

try {
  if (token) {
    return jwt.verify(token, YOUR_SECRET_KEY);
  }
  return null;
} catch (err) {
  return null;
}

在解析器中使用上下文

users: (parent, args, contextValue) => {
  if (!contextValue.user) return null;
  return ['bob', 'jake'];
};

七、基于模式的授權

對于復雜需求,可在 GraphQL 模式中定義規則。例如,僅允許用戶訪問自己的數據:

const CanPublishPost = preExecRule(async (context, fieldArgs) => {
  const graphQLResult = await graphql({
    schema: context.schema,
    source: `query post($postId: ID!) {
      post(id: $postId) {
        author { id }
      }
    }`,
    variableValues: { postId: fieldArgs.postId },
  });
  const post = graphQLResult.data?.post;
  return post && post.author.id === context.user?.id;
});

八、Hasura 的聲明式授權解決方案

Hasura 提供高效、聲明式授權機制,顯著簡化了復雜授權邏輯的實現。

聲明式授權

細粒度訪問控制

謂詞下推


九、跨源授權

Hasura 支持跨數據源授權,通過解析后的值作為標頭轉發到外部服務,實現外部服務中統一的授權控制。


十、總結

構建 GraphQL 授權層是一項復雜任務,涉及:

Hasura 的聲明式授權和謂詞下推技術:

對于開發者而言,Hasura 是一種高效且可維護的 GraphQL 授權解決方案。


原文鏈接: https://hasura.io/blog/the-complexity-of-building-a-graphql-api-permissions-layer-and-how-hasura-solves-this

上一篇:

API可觀察性:需要監控的5個指標
最后一篇
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費