Ruby on Rails

【Ruby on Rails】権限管理にどのGemを使おうか

Railsの権限管理で候補にあがるGemは、CanCanCanPunditBankenの3つ。どのGemを使おうか悩んだときのメモ。

この記事の内容

  • Railsの権限管理で候補に上がるGem
  • CanCanCan
  • Pundit
  • Banken

CanCanCan vs Pundit vs Banken

  • CanCanCan
    • 独自DSL
    • Controller毎に定義していた認可条件をAbilityクラスに集中
    • 権限ごとに各リソースとActionに対する認可条件を定義
    • Abilityクラスが肥大しがち
  • Pundit
    • https://github.com/varvet/pundit
    • ModelごとにPolicyクラスを作成しActionに対する認可条件を定義
    • Model, Policy, Controller が1:1:1という制約あり
  • Banken
    • ControllerごとにLoyaltyクラスを作成しActionに対する認可条件を定義
    • PunditのModelよりな責務をControllerよりに書き換え

DSLであるCanCanCanは学習コストがありそう、肥大しがちとのことなので候補から外した。
Pundit or Banken、どちらにするかで悩む。

Punditを使ってみよう

どちらのgemも直接的な責務は別クラス(PunditならPolicyクラス、BankenならLoyaltyクラス)
PunditBankenの大きな違いは、Modelに責務をもたせるかControllerに責務をもたせるか
RESTfulなアプリケーションであることを遵守できていれば、Punditの思想であるModelごとに権限が管理できるのが理想となるであろう(Controllerごとである必要はないはず)
そして、スター数が1番多い(2018/5/12現在)ので、Punditを採用することにする

-Ruby on Rails