假设有一个对象
TaskList
,只能由其所有者编辑和删除。其他用户只能接受任务并更新其状态。
我想到了以下选项:
使用的技术是Java。
还有其他/更好的想法吗?
有关安全和 DDD 的有趣文章
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
设为接口,并通过代理或访问器隐藏实现类。
public class TaskList {
private SystemUser owner;
private List<Task> tasks = new ArrayList<>();
public TastList(SystemUser owner) {
this.owner = owner;
}
public void Add(Task task) {
Guard.allowFor(owner);
tasks.add(task);
}
}
Guard
知道当前用户(例如来自本地线程)并将其与作为参数传递给
allowFor(owner)
的所有者进行比较。如果访问被拒绝,将引发安全异常。这简单、健壮,甚至易于维护,因为如果底层身份验证发生变化,只需更改防护。