语境
- 卖家列出物品的商业市场
- 有一个操作 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 代表必须“成为”卖方的方法。有一定的清洁度(因为它确实将安全模型集中在域而不是用例上)。(注意将进行充分的审计以检测某人何时代表他人行事)
意见?