コンテクスト
- 売り手がアイテムをリストするコマースマーケット
- オペレーションItem::setPriceがあります
- アイテムの販売者またはカスタマーサービス担当者は、アイテムの価格を変更できます。
- #3のセキュリティチェックは、セキュリティチェックの対象範囲を最大化するために、アイテムのデータアクセス層の近くに実装されます。
多くの人がセキュリティを直交する懸念として話すのが好きですが、特にインスタンスレベルのセキュリティについて考えるとき、それはドメインモデルに容赦なく結びついているので、私は(現在?)それに参加していません。肝心なのは、私は実際、#3のセキュリティ不変条件をコードで明示的に記述することを好みます(コードを介して、またはSpring Security ELアノテーションによって)。このようなセキュリティ不変条件は、ビジネスロジックの一部であると私は考えています。開発者の顔にもセキュリティが必要です。それは彼らの責任IMOと直交していません。
私は次のように書くかもしれません:
@PreAuthorize("hasRole('CSR_ITEM_WRITER') or #item.seller.id == principal.id')
public void setPrice(Item item, Money price) { ... }
これは、セキュリティモデルの進化に関して、ある程度の柔軟性の欠如を生み出すことを私は理解しています(しかし、それを間違えることの意味を考えると、それはそんなに悪いことですか?)
また、CS担当者が売り手になる必要があるアプローチについても説明しました。これには一定のクリーンさがあります(つまり、ユースケースではなく、ドメインを中心としたセキュリティモデルに焦点を当てています)。(NBは、誰かが別の人に代わって行動していることを検出するために十分な監査が実施されます)
意見?