エンティティ 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
私は主題に関する論文を見つけました。その論文の結論は、ドメインオブジェクトメソッドに注釈を付けてそれらを保護するのが良い方法であると述べています。これについて何か考えはありますか?