GraphQL-Rubyでの権限制御について | Dev Driven 開発・デザインチーム GraphQL-Rubyでの権限制御について | 働くひとと組織の健康を創る iCARE

BLOG

GraphQL-Rubyでの権限制御について

2020/07/20

こんにちわ!
株式会社iCARE、サーバーサイドエンジニアの師匠です。

何だこのサムネは?という疑問に、これは社長と調べて、いらすとや さんで出てきた絵です。

今回はということで権限について書きます。

最近自分はGraphQLの実装を行っているのですが、弊社のCarelyというプロダクトは権限制御が大切になってきます。

Punditというgemも使っているのですが、権限が豊富なゆえ、Policyのファイルがごちゃごちゃしてきているという事もあります。

GraphQLのmutationの際にGraphQL-Rubyで書ける便利な権限制御のやり方を見つけたのでブログに書きたいと思います。

GraphQL-Ruby/mutationでの権限制御実装

参考文献はもちろん公式のGraphQLのドキュメントです。
https://graphql-ruby.org/mutations/mutation_authorization.html#checking-the-user-permissions

やりたいこと

mutationを実行する前に現在のユーザーが実行する権限を持っているか確認したい。
オブジェクトを変更する権限があるか確認したい。

こんな事がCarelyでは多々起きるので、楽に書けないかなと思ったときにこんなメソッドを発見しました。

ready?のメソッドを使いこのように書くことができる。

class Mutations::PromoteEmployee < Mutations::BaseMutation
  def ready?(**args)
    # Called with mutation args.
    # Use keyword args such as employee_id: or **args to collect them
    if !context[:current_user].admin?
      raise GraphQL::ExecutionError, "Only admins can run this mutation"
    else
      # Return true to continue the mutation:
      true
    end
  end

  # ...
end

エラーメッセージを出したい場合はこちら

def ready?
  if !context[:current_user].allowed?
    return false, { errors: ["You don't have permission to do this"]}
  else
    true
  end
end

このready?のメソッドを各mutationに書いてあげる事でそのmutationを実行する前に現在ログインしているユーザーに何かしらの判定をかけてあげて場合分する事で権限の制御をすることができます。

Carelyの中では、それぞれのmutationが継承する元(base_mutation)に判定のロジックを書いて、何度も同じことを書かなくて良いようにしています。

終わりに

なかなかGraphQL-Rubyを使用している日本語の文献は出てこないので、公式ドキュメントの読み込みが大切だなと思いました。
意外と便利なメソッドが色々と実装されているので、他にも今後紹介していきたいと思います。