2

現在、私たちの Web プロジェクトでは一部のデータを匿名化する必要があります。
(たとえば、432-55-1111 のようなセキュリティ番号は、432-55- * * と表示される場合があります) これらのデータには、電子メール、ID、価格、日付などが含まれる場合があります。

マスクする必要があるテーブルの名前と列はDBに保存されました。
春のセキュリティを使用して、ユーザーがデータを見ることができるかどうかを判断しています。
データ ドメイン オブジェクト (CMP) は、SQL または JPQL (名前付きクエリまたはネイティブ クエリ) または JPA ロード メソッドまたはメインフレームから取得できます。

これらのデータを動的にマスクする最も効率的な方法(DB 側ではなく)を見つける必要があります。
EJB メソッド end でインターセプターを使用する場合、すべてのオブジェクト (DTO) とすべての列に注釈を付ける必要があります。それは効率が悪いかもしれません。
SQL が実行され、名前付きクエリ (ネイティブ クエリ) が実行されたときにメソッド (インターセプターなど) を呼び出す方法は誰でも知っています。メソッドを呼び出して、クエリとユーザー ID によって結果をマスクすることもできます。

または他の方法。

レポートなどの他のアプリケーションが別のソリューションを必要としないように、これを最下位レベルに置くことをお勧めします。

私たちのプロジェクトのアーキテクチャは JSF+Spring+EJB 3.0+JPA 1.0 です。
多くのWebプロジェクトがあります。
JPA の場合、EclipseLink 2.2 を使用するプロジェクトと、Hibernate を使用するプロジェクトがあります。

更新: 私たちのプロジェクトに関する詳細情報。さまざまな機能に関する多くの Web プロジェクトがあります。そのため、それらに関連付けられた多くの ejb プロジェクトがあります。すべての ejb には、JPQL または get(class, primarykey) メソッドを呼び出して CMP を取得するための DAO があります。以下のように:

Query   query = em.createNamedQuery(XXXCMP.FIND_XXX_BY_NAME);
                query.setHint(QueryHints.READ_ONLY, HintValues.TRUE);
                query.setParameter("shortName", "XXX").getSingleResult();

または

XXXCMP screen = entityManager.find(XXXCMP.class, id);

CMP から DTO にデータを変換する新しい EJB サービス コード コンバーター。
以下のようなコンバータ:

/**
 * Convert to CMP.
 * 
 */
CMP convertToCMP(DTO dto, EntityManager em);

/**
 * Convert CMP to domain object with all fields populated, the default scenario is
 * <code>EConvertScenario.Detail</code>.
 * 
 */
DTO convertFromCMP(CMP cmp, EntityManager em);

しかし、一部の古いサービスでは、CMP を変換するために独自の方法が使用されています。また、一部のドメイン サービスでは、検索の遅延処理に使用され、コンバーターも使用されていません。

CMP が DTO に変換する前に、データをマスクしたいと考えています。

4

2 に答える 2

0

この場合、JSFの変換フェーズを傍受する可能性があります。このソリューションは、レポートではなく、JSFビューに適用されます。

@FacesConverter("AnonymizeDataConverter")
public class AnonymizeDataConverter implements Converter{

    @Override
    public Object getAsObject(FacesContext context, UIComponent component,
        String value) {

        return getAnonymisedData(value);
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component,
            Object value) {

        return getAnonymisedData(value);     
    }

    public static String getAnonymisedData(Object data) {
        if (data == null) 
            return "";

        String value = data.toString().trim();

        if (!value.isEmpty())
            return value.substring(0, value.lenght() - 4) + "**";

        return "";
    }

}
于 2013-01-20T10:51:27.817 に答える
0

アノテーションEntityListenerを使用して、永続化コンテキストへのエンティティの読み込みをインターセプトすることができます。@PostLoad

それ以外の場合は、マスキング/フォーマットなどに適していると思われるアクセサーメソッド(ゲッター/セッター)内で試すことができます.

編集:(コメントと質問の更新に基づく)

アプリケーション間でエンティティ/DTO を共有できます

public String getSomethingMasked(){

   return mask(originalString);
}
  • データ取得パターンは、アプリケーション間で均一ではありません。すべてのアプリケーションが同じデータベースを使用している場合は、一般化する必要があります。同じことを別のツールで書き直しても意味がありません。各アプリケーションは、後でビジネス ロジックを適用する場合があります。

    おそらく、データベースとやり取りするための別のプロジェクトを作成し、それを他のアプリケーションに含めてさらに使用することができます。したがって、何かを変更したり、デバッグしたり、強化したりすることは共通点になります。

  • データをフェッチするためにEclipselink、Hibernate、およびその他のカスタム方法を使用しており、最小限の回避策が必要ですが、私の観点からは難しいようです。

    データの取得を一元化するか、可能であれば全体を個別に変更しますが、これは実現不可能であり、一貫性が損なわれます。

于 2013-01-13T06:22:47.023 に答える