본문 바로가기

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

(34)
Rails Authorization with Pundit 출처: https://www.sitepoint.com/straightforward-rails-authorization-with-pundit/#report-ad "Pundit" 은 "학자" 또는 "똑똑한 사람"(때때로 부정적인 의미로 씌인다)를 뜻하지만 실제로 이를 사용하기 위해서는 똑똑할 필요는 없다. Pundit 은 굉장히 이해하기 쉽다. Pundit 의 도큐멘테이션을 살펴보면서 나는 pundit과 사랑에 빠지게 되었다.Pundit 의 배경에 있는 아이디어는 새로운 DSL 을 이용하지 않고 이전의 Ruby 클래스와 메서드를 사용함에 있다. 이 젬은 오직 몇 개의 유용한 헬퍼들만 추가하므로 전반적으로 당신이 적합하다고 생각하는 방식으로 시스템을 만들 수 있다. 이 해결책은 CanCanCan 보다 약간 낮..
(33) Graphql-ruby - 에러 핸들링 Errors in GraphQL GraphQL 에는 다양한 종류의 에러가 있다. 이번 포스팅에서는 주요 에러들과 언제 이를 적용해야 되는지에 대해서 알아볼 것이다. Validation Errors GraphQL 은 타입 언어이기 때문에 쿼리를 실행하기 전에 모든 쿼리에 대해서 유효성 검사를 실행한다. 만약에 요청된 쿼리가 유효하지 않다면 이는 실행되지 않을 것이다. 대신 응답은 에러와 함께 되돌려보내질 것이다.{ "errors" => [ ... ] } 각 에러는 message, line, column 그리고 path 를 가지고 있다.유효성 검사 규칙은 GraphQL 스펙의 일부분이며 GraphQL-Ruby 에 내장되어 있기에 쿼리를 수행할 때 모든 유효성 검사를 스킵하도록 validate: false 를..
(32) Graphql-ruby - Mutation의 모든 것 Mutation RootGraphQL mutation 은 모두 mutation keyword 로 시작한다.mutation($accountNumber: ID!, $newBalance: Int!) { # ^^^^ here setAccountBalance(accountNumber: $accountNumber, newBalance: $newBalance) { # ... } } mutation 으로 시작하는 동작들은 GraphQL 런타임에 의해서 특별한 취급을 받는다. 루트 필드들은 순차적으로 실행되도록 보장된다. 이러한 방법으로 여러개의 mutation 의 결과를 예측할 수 있다. mutation 은 특정한 GraphQL 객체인 Mutation 에 의해 실행된다. 이 객체는 다른 GraphQL 객체들과 같이 정..
(31) Graphql-ruby - 필드(fields) 의 모든 것 Introduction 객체 필드는 해당 객체에 대한 데이터나 다른 객체와의 연결에 대한 데이터를 보여준다. field(...) 클래스 메서드를 사용해서 객체에 필드를 추가할 수 있다.field :name, String, "The unique name of this list", null: false Objects 와 Interfaces 는 필드를 가진다.필드 정의는 아래와 같은 요소들을 갖는다.Return types 은 해당 필드가 어떤 종류의 데이터를 리턴하는지에 대해 알려준다.Documentation 필드에 대한 설명과 더이상 쓰이지 않는 필드에 대해 설명한다.Resolution behavior Ruby 코드와 GraphQL 필드를 엮는다.Arguments 쿼리가 있을 때 필드에 입력값을 받도록 한다..
(30) Graphql-ruby - 범위설정(scoping) Scoping Scoping 은 권한부여와 함께 사용하는 것을 고려해볼만 하다. "이 사용자가 이걸 볼 수 있어?" 라고 체크하는 대신에 scoping 은 아이템 리스트를 현재 사용자와 context 를 적합한 하위 집합으로 필터링 한다. 결과 하위집합은 정상적으로 권한부여가 되고, 각 아이템은 권한부여 검사를 통과해야 한다. 비슷한 기능으로는 Pundit scopes와 Cancan’의 .accessible_by.를 참고하자. scope: option 필드는 스코핑을 가능하게 하거나(또는 불가능하게 하기 위해) scope: 옵션을 받는다.field :products, [Types::Product], scope: true # Or field :all_products, [Types::Product], sco..
(29) Graphql-ruby - Pundit Integration ⚡️ Pro Feature ⚡️ 해당 기능은GraphQL-Pro 에서만 가능하다. Pundit Integration GraphQL::Pro 에서는 GraphQL authorization 과 Pundit policies 의 통합을 사용할 수 있다.귀찮게 왜 이렇게 해야되는가? GraphQL 타입 자체에 권한부여 코드를 넣을 수도 있지만 따로 권한부여 레이어를 작성하는 것은 몇가지 이점을 준다.authorization 코드가 GraphQL 에 포함되어 있지 않기 때문에 , 같은 로직을 앱의 GraphQL 이 아닌 부분(또는 레거시 코드)에도 사용 가능하다.authorization 로직은 독립되어 테스트 하는게 가능해지고, 그러므ㄹㅗ GraphQL 테스트는 그만큼 많은 가능성들을 테스트 하지 않아도 된다. G..
(28) Graphql-ruby - Authorization 의 모든 것 Overview 다음은 GraphQL 권한부여에 대한 개념적인 접근과 내장된 권한부여 프레임워크에 대한 설명이다. 프레임워크의 각 부분은 각각의 가이드에 설명되어 있다. Authorization: GraphQL vs REST REST API 에서는 일반적인 권한 부여 패턴은 꽤 단순하다. 요청된 액션을 시행하기 이전에 서버는 현재 클라이언트가 해당 액션에 대한 필요한 권한이 있는지 확인한다.class PostsController
(27) Graphql-ruby - Non-Null 타입 Non-Null Types GraphQL 에서 non-null 은 !로 표현된다.type User { # T이 필드는 항상 String을 리턴하지만 절대로 null을 리턴하지는 않는다 handle: String! # `DateTime` 값은 반드시 전달되어야 하며, 생략되거나 `null`을 패스할 수는 없다 followers(since: DateTime!): [User!]! } Ruby에서는 이 개념이 필드에서는 null:, argument에서는 required: 라고 표현된다. Non-null return types위에서의 handle: String!처럼 !이 필드 리턴타입에 사용되었을 경우, 이는 필드가 절대로 nil을 리턴하지 못한다는 것을 뜻한다.non-null 필드를 만들기 위해서는 null: ..