2017-04-30 6 views
0

기본적으로 어떻게 사용 권한을 처리합니까? GraphQL 승인/허가

은의 우리가 게시물의 양을 제한하는 인수 으로, 어떤 종류의 포스트 (들)의 목록이 있다고 가정 해 봅시다. 소유자와 승인 된 사용자 만 게시물을 읽을 수 있지만 다른 모든 사람들은 게시물을 읽을 수 없습니다. 이것을 구현하는 가장 좋은 방법은 무엇입니까? 내가 현재 생각하고 무엇

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

는 사용자가 게시 여부를 읽을 수 있는지 여부에 단일 정보 소스를 가지고 있고, dataloader 모듈로를 연결하는 것입니다.

하지만 정확하게 10 개의 게시물을 어떻게 쿼리합니까? 내 DB에 정확히 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 인 경우에도 모든 행을 쿼리한다는 것을 분명히 알 수 있습니다. 이는 피하려고하는 것입니다.

어쩌면 비즈니스 로직이 DB보다 다른 계층에 있기 때문에 어떤 방식 으로든 문제가 해결되고있을 수 있습니다. 따라서 모든 행을 쿼리하는 것은 불가능합니다. 어떤 도움을 주셔서 감사합니다.

+1

GraphQL을 사용하여 인증 및 권한을 처리하는 방법에는 여러 가지가 있습니다. 기본적으로 적절한 접근 방식을 결정할 때까지만 사용할 수 있습니다. 단지 도움이 될만한 리소스가 두 개 더 있음을 나타냅니다. 1. 2017 년 apollo에서 주어진 대단한 이야기 ​​https://www.youtube.com/watch?v=xaorvBjCE7A 2. 그래프 쿨 (graphcool)에서 사용 권한을 구현하는 방법 : https://www.graph.cool/blog/2017 -04-25-graphql-permission-queries-oolooch8oh / – nburk

답변