bankenの思想を読み解く

github.com

認可ロジックの居場所を整理するため、bankenの導入を検討するにあたり、READMEを読んで思想を理解したい。

認可に関するgemといえば他にCanCanCanPunditがあるが、これらのgemとの比較は作者の方がしてくれている。

まぁ読んでくださいという感じ。

僕の視点で再整理する(あくまで僕の視点なので指摘や意見などください)。

  • 要するに「認可」とは3つの要素に紐付いている
    • ユーザ(の持つ権限)
    • Controller/Action
    • Resource

f:id:nisshiee:20170419100012p:plain

  • 故に、認可ロジックの置き場は散らかりやすい
  • 認可gemはこれを整理するため、各々、3要素のどれか1つを整理の起点に定めている
    • CanCanCan -> ユーザ(の持つ権限)
    • Pundit -> Resource
    • banken -> Controller/Action

f:id:nisshiee:20170419100026p:plain

同じ図だが、”見方”の違いが整理の仕方に現れる

で、どれが良いかという議論は難しい。

# TODO: この辺、絵を描いて表現したい

どれを取っても、「<起点にしなかった要素>が複雑になると認可ロジックが荒れるよね」という議論ができる。

例えば上のスライドには「Punditの場合、1つのResourceが複数のControllerから管理されている場合ややこしくなる」という話が書いてあるが、同じように「bankenの場合、1つのActionが複数のResourceを管理している場合ややこしくなる」と言えてしまうわけだ。なので、「じゃあ実際、どれが一番起こりにくそうですか?」レベルの比較しかできない。

そういう意味で、「これを選ぶべき」という積極的な選択は今のところできなそうだ、というのが所感。

じゃあなぜbankenを選ぼうとしているかというと、1つ、bankenが合いそうだという理由がある。今の開発チームには「ディレクター」と呼んでいる役割の人がチームにいるということ。この場合は、「この画面は、この人にしか見れない」といったように、Controller/Actionを起点にする考え方が、もっとも理解が容易なのではないか、と思っている。