본문 바로가기

배움의 즐거움/프로그래밍

(12) Graphql-ruby - 제한하여 보여주기

반응형

Limiting Visibility


때때로 사용자로부터 스키마의 요소를 숨기고 싶을 때가 있을 것이다. 예를 들면


오직 이러한 필드에 접근을 제한하려 한다면, 런타임에서 객체를 체크하기 위해서 field instrumentation 를 사용하는 거나, 쿼리를 실행하기 이전에 체크하기 위해 query analyzers 를 사용하는 것을 고려해볼 수 있다.


만약 필드를 완전히 숨기고 싶다면 아래를 읽어보자.


Filtering


except: 또는 only: 를 Schema.execute 에 전달하므로써 스키마의 일부분을 숨길 수 있다. 예를 들어:

# `except:` 블랙리스트 아이템 제외
filter = PermissionBlacklist.new(@current_user)
MySchema.execute(query_string, except: filter)
# OR
# `only:` 화이트리스트 아이템만 통과
filter = PermissionWhitelist.new(@current_user)
MySchema.execute(query_string, only: filter)


이 쿼리에서 몇몇의 요소들은 숨겨져 있을 것이다. 이것은 필드, 타입, arguments, enum 값 등이 아예 정의되지 않은 것처럼 다뤄질 것이라는 뜻이다. 


필터는 #call(schema_member, ctx) 에 응답한닽. 해당 메서드가 참값을 리턴한다면, 스키마 멤버는 차단되거나 통과될 것이다.


예를 들어, 아래는 PermissionWhitelist 을 구현한 것이다.

class PermissionWhitelist
  def initialize(person)
    @person = person
  end

  # 만약 이것이 true 를 리턴한다면, 해당 스키마 멤버는 허용된다.
  def call(schema_member, ctx)
    Permissions.allowed?(person, schema_member)
  end
end


schema_member 은 다음 중 하나일 것이다.



Printing a Filtered Schema


해당 필터를 스키마와 함께 출력함으로써 어떻게 필터가 해당 스키마에 적용될 것인지 볼 수 있다. 

 GraphQL::Schema#to_definition 는 오직 only: 과 except: 만 받는다.


example_user = User.new(permission: :admin)
filter = PermissionWhitelist.new(example_user)
defn_string = MySchema.to_definition(only: filter)
puts defn_string
# => 필터된 스키마 출력


Schema#to_definition 는 또한 context 도 받는다. 예를 들면:

context = { current_user: example_user }
puts MySchema.to_definition(only: filter, context: context)


* 해당 글은 번역기 돌리다가 크롬 번역기 말도 안되는 해석에 지친 본인이 나중에 참고할 의도로 대충대충 발로 해석한 것이니 참고용으로만 사용하시길 바랍니다.

* 출처: http://graphql-ruby.org/schema/limiting_visibility.html 일부분 발췌


반응형