コンテンツにスキップ

ドメインの権限管理が適切に設計されているか?

Type: Structure
Category: ドメイン
Audience: 設計初心者 / 設計中のチーム / レビュワー


背景・概要

業務において誰が何をできるか/できないかは重要な制約事項であり、実装の初期から考慮しておかないと後のセキュリティ事故・バグ・混乱の原因となる。 ドメイン層で表現すべきか、アプリケーション層で制御すべきかの切り分けも重要


  • Task.canApprove(user: User): Boolean のような問いかけ型のメソッドは設けず、Task.approve(user: User)内で権限制御するか、複雑な場合はTaskApprovalPolicyのようなポリシードメインを作成する
  • ロールや権限はEnum/DB/sealed interfaceなどで管理し、表示・ユーザー操作の制御は画面やAPIで行う
  • 各ユースケース(ApplicationService)では権限チェックを明示的に記述して曖昧さを排除する

よくある失敗例

  • 「一部の画面では表示されるが、操作はできない」など中途半端な制御になる
  • フロント側でしか制御されておらず、APIを直接叩けば何でもできてしまう状態
  • 権限制御がコードベースのあちこちに散らばっており、ロール追加や変更時にミスが頻発

FAQ

Q. 権限チェックはユースケースかドメインか?

A. ケースバイケース。ドメインでは「このデータに対して誰が何をできるか」を制御し、ユースケースでは「業務上その操作が可能か」を判断するのが無難と思われる

Q. 権限のソースはEnumかDBかどこにおく?

A. 小規模ならEnum、大規模ならDBやStrategy(Policy)パターンを使って柔軟に実装できる


関連観点