如果我有一个实体 Entity 和一个服务 EntityService 和 EntityServiceFacade 具有以下接口:
interface EntityService {
Entity getEntity(Long id);
}
interface EntityServiceFacade {
EntityDTO getEntity(Long id);
}
通过在服务级别控制对 getEntity 方法的访问,我可以轻松地保护对实体的读取访问。但是一旦门面引用了一个实体,我该如何控制对它的写访问呢?如果我有一个 saveEntity 方法并像这样在服务(不是外观)级别控制访问(此处使用 Spring 安全注释):
class EntityServiceImpl implements EntityService {
...
@PreAuthorize("hasPermission(#entity, 'write')")
public void saveEntity(Entity entity) {
repository.store(entity);
}
}
class EntityServiceFacadeImpl implements EntityServiceFacade {
...
@Transactional
public void saveEntity(EntityDTO dto) {
Entity entity = service.getEntity(dto.id);
entity.setName(dto.name);
service.save(entity);
}
}
这里的问题是访问控制检查在我更改实体名称之后已经发生,所以这还不够。
你们是怎么做到的?您是否改为保护域对象方法?
谢谢
编辑:
如果您保护您的域对象,例如使用以下注释:
@PreAuthorize("hasPermission(this, 'write')")
public void setName(String name) { this.name = name; }
然后我是否打破了域模型(根据 DDD?)
编辑2
我找到了一篇关于这个主题的论文。该论文的结论说,一个好的方法是注释域对象方法以保护它们。对此有什么想法吗?