假设有一个对象TaskList
,只能由其所有者编辑和删除。其他用户应该只能执行任务并更新其状态。
我想到了以下选项:
使用的技术是Java。
还有其他/更好的想法吗?
有关安全性和DDD的有趣文章
我现在已经接受了我自己的答案,因为这是我实际使用的,但欢迎进一步的建议。
答案 0 :(得分:2)
我不会将所有权/权限模型编码到TaskList
域对象中。那种业务逻辑应该是外部的。我也不喜欢代理对象的想法。虽然它肯定会起作用,但它会使调试混乱,并且在这种情况下至少是不必要的复杂。我也不会在控制器中检查它。
相反,我会创建一个业务逻辑对象来监督TaskList
的权限。所以TaskList
会有一个所有者字段,但你会有类似的东西:
public class TaskListAccessor {
private TaskList taskList;
private User reader;
public void updateStatus(Status status) {
// everyone can do this
taskList.updateStatus(status);
}
/** Return true if delete operation is allowed else false */
public boolean isDeleteAllowed() {
return taskList.getOwner().equals(reader);
}
/** Delete the task. Only owners can do this. Returns true if worked else false */
public boolean delete() {
if (isDeleteAllowed()) {
taskList.delete();
return true;
} else {
return false;
}
}
// ... other accessors with other is*Allowed methods
}
如果您需要要求TaskList
个对象上的所有操作都通过访问器,那么您可以创建一个工厂类,这是唯一一个使用包构造函数或其他东西创建TaskList
的工厂类。也许工厂是唯一一个使用DAO从数据存储中查找TaskList
的工厂。
但是,如果以这种方式控制的方法太多,那么代理可能会更容易。在这两种情况下,建议使用TaskList
作为接口,实现类由代理或访问者隐藏。