2017-04-30 110 views
0

那麼基本上你如何處理權限?GraphQL授權/許可

比方說,我們有某種(S)列表,以及一個參數第一限制的職位的數量。只有擁有者和已批准的用戶才能閱讀帖子,而其他人則不能。什麼是實施這個最好的方法?

query { 
    { 
    viewer { 
     posts(first: 10) { 
     id 
     text 
     } 
    } 
    } 
} 

我目前想的是什麼,是有一定道理的單一來源,以用戶是否可以閱讀後與否,並與dataloader模塊把它掛。

但是,如何查詢恰好10個帖子?如果我查詢我的數據庫正好有10行,當我稍後用一些業務邏輯過濾它們時,我可以獲得例如8個返回的帖子。

解決方法是不在查詢上放置limit,但這不是非常有效。那麼有什麼好辦法可以解決這個問題呢?


從這裏的啓示

(1)https://dev-blog.apollodata.com/auth-in-graphql-part-2-c6441bcc4302

(2)https://dev-blog.apollodata.com/graphql-at-facebook-by-dan-schafer-38d65ef075af

(1)解決了它通過

export const DB = { 
    Lists: { 
    all: (user_id) => { 
     return sql.raw("SELECT id FROM lists WHERE owner_id is NULL or owner_id = %s, user_id); 
    } 
    } 
} 

作爲查詢,然後到過濾出哪些行可以被讀取:

resolve: (root, _, ctx) => { 
    // factor out data fetching 
    return DB.Lists.all(ctx.user_id) 
     .then(lists => { 
     // enforce auth on each node 
     return lists.map(auth.List.enforce_read_perm(ctx.user_id)); 
     }); 
    } 

因此,我們可以清楚地看到它正在查詢所有行,即使假設第一個參數是1,這就是我想要避免的。

也許我以某種方式解決了問題,因爲業務邏輯位於另一層而不是數據庫之上,因此無法查詢所有行。任何幫助讚賞。

+1

有很多方法可以處理用GraphQL進行的身份驗證和權限,它基本上取決於您決定是否採用適當的方法:)只是想指出另外兩個可能有用的資源。 1.在2017年阿波羅天舉行的非常棒的演講https://www.youtube.com/watch?v=xaorvBjCE7A 2.我們如何在graphcool實施權限:https://www.graph.cool/blog/2017 -04-25-graphql的許可查詢,oolooch8oh / – nburk

回答