1

エンティティ 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

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

4

2 に答える 2

2

個々のエンティティ メソッドやプロパティが変更されないように保護することについては心配しません。

永続性を制御できる場合、ユーザーがメモリ内のエンティティを変更できないようにする必要は必ずしもありません。

ここでの大きな落とし穴は UX です。エンティティに加えられた変更を永続化できない可能性があることをできるだけ早くユーザーに通知する必要があります。決定する必要があるのは、持続時間までセキュリティ チェックを遅らせてもよいかどうか、または事前にユーザーに通知する必要があるかどうかです (たとえば、UI 要素を非アクティブ化することによって)。

于 2010-11-15T10:36:37.953 に答える
1

インターフェースならEntityメンブレンできませんか?

したがって、エンティティが次のようになっている場合:

interface Entity {
  int getFoo();
  void setFoo(int newFoo);
}

のような膜を作る

final class ReadOnlyEntity implements Entity {
  private final Entity underlying;

  ReadOnlyEntity(Entity underlying) { this.underlying = underlying; }

  public int getFoo() { return underlying.getFoo(); }  // Read methods work

  // But deny mutators.
  public void setFoo(int newFoo) { throw new UnsupportedOperationException(); }
}

読み取りメソッドに注釈を付ける場合、Proxy クラスを使用して、複数のクラスにまたがるメンブレンを自動的に作成できます (したがって、 を返す readonly の get メソッドは readonlyEntityを返しEntityPartますEntityPart)。

このアプローチの詳細については、 http://en.wikipedia.org/wiki/Object-capability_modelの深い減衰を参照してください。

于 2010-11-18T06:58:13.883 に答える