0

特定の動作を拡張する必要がある状況があり、それを正しく設計する方法に行き詰まっています。ユーザーはすべてのレポートのリストを表示できます。レポートは今のところ単純な POJO です

class Report {
  ...
}

特定のレポートで呼び出すことができる一連のアクションがあります。現在、一部のレポートでは、許可されるアクションを定義する必要があるという要件があります。たとえば、ReportOne では "ActionA" と "ActionB" を実行し、ReportTwo では "ActionB" のみを実行し、ReportThree では (現在のように) すべてのアクションを実行できます。また、レポートの表示は制限されているため、十分な権限がない場合、一部のユーザーは特定のレポートを表示できません。

以下のような Report のサブクラスを作成することを考えています。

class ReportWithCustomActionsAllowed extends Report {
  private Set<Action> allowedActions;
  public Set<Actions> getAllowedActions() {
    return actions;
  }
  ....
}

class ReportWithPermission extends Report {
  ...
  private String permissionName = "ReportA.VIEW";
  public boolean canShowTo(User user) {
    return user.hasPermission(permissionName);
  }
}

ここで間違っていることが2つあります。

1) 別のクラスを作成しない限り、許可されたカスタム アクションを使用して制限付きレポートを作成することはできません。

2)Set<Report>ハッキングせずにアクション/レポートを制限することはできませんが、instanceofこれは明らかに間違っています。

OOPを正しく実行してこの要件を実現するにはどうすればよいですか? すべてのレポートでパーミッションを気にする必要はありません。レポートには、許可されたアクションのリストが空である可能性があります (これは、アクションに誰もアクセスできないことを意味します。すべてのアクションが許可されているわけではありません)。

4

2 に答える 2

1

アクションについては、おそらく「責任の連鎖」設計パターンを適応させることができます。

アクセス許可の場合、通常の方法は、レポートに許可を考慮させるのではなく、誰が何を行うことが許可されているかのリストを維持する外部セキュリティマネージャーを持ち、アクションが呼び出されたときに、そのロールがアクションを呼び出すことは許可されています。これは実際には非常に複雑な作業なので、より適切な提案が必要な場合は、セキュリティ要件がどの程度広範囲にわたるかをより正確に指定することをお勧めします。

于 2012-11-12T16:30:22.490 に答える
0

完全な詳細はわかりませんが、抽象クラスに行きReport、1 つの抽象メソッドgetActions(User user)を持ち、そのメソッドが a またはそのようなものをスローするUserAccessExceptionようにします。

abstract class Report {

abstract public Set<Action> getActions(User user) throws UserAccessException;

}
于 2012-11-12T16:05:51.227 に答える