認可における普遍的な概念としてのgroupとroleは紛らわしい。 権限管理のフレームワークやライブラリにおいて、groupとroleの両方が同時に利用可能な場合、どのように使い分ければよいのか混乱するから自分の理解をメモしておく。 困ったことに、どちらを使っても同じ目的を達成できることが多く、人間が概念を理解し運用設計をしなければ使いこなせない。
原則
基本の考え方は次の3つに集約される。
- groupはuserの集合である
- roleはpermissionの集合である
- permissionの付与は原則roleで単位で行う
この定義から、次のような2つの運用上の原則が導かれる。
- 大多数に当てはまる通常の権限付与ではuserをgroupでまとめ、groupにroleを付与する。もしroleを付与できない場合はpermissionを付与する。
- 例外的な権限付与は個別のroleをuserに追加する。
ここで、roleは必要に応じて追加されうるという点に注意せよ。 追加は永続的なものかもしれないし、一時的なものかもしれない。
理由
以降は理由や例を記載する。
大多数をカバーする非例外的、通常の権限付与はgroupを介して行うべきである。 具体的にはgroupを作成し、そのgroupに複数のuserを追加し、groupにロールを付与する。 もしシステム側の制約でroleを付与できない場合は代わりにpermissionを追加する。 このgroupは現実世界の役職などに合わせることが適切だろう。
例
stock_managerグループを作成し、そこに在庫管理する複数のuserを追加する。 stock_managerに在庫を管理するpermissionが定義されたroleを付与する。
この方法の利点は、運用上の手間が少ないことである。 改修などでpermissionなどが増えた場合、groupに紐づくroleを1回だけ修正すれば良い。
例外な権限付与の場合はgroupとは無関係に、必要なuserにだけroleを追加する。
例
ユーザAliceは、viewerのgroupに入っているから基本的には読み取りしかできないが、Aliceに個別のroleを付与して書き込み権限を追加で与える。
また、よりリスクが高い操作を行うために期限付きで一時的にroleを付与する使い方も考えられる。
例
普段は自分の認証に関わる情報を読み取ることができないが、二要素目の認証を行うことで一時的に読み取るためのroleを付与する。
次のstackoverflowのやりとりが参考になる。
https://stackoverflow.com/questions/7770728/group-vs-role-any-real-difference