GraphQL-Rubyでの権限制御について
こんにちわ!
株式会社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を使用している日本語の文献は出てこないので、公式ドキュメントの読み込みが大切だなと思いました。
意外と便利なメソッドが色々と実装されているので、他にも今後紹介していきたいと思います。