Web项目的动态掩码数据

时间:2013-01-13 05:23:32

标签: jpa ejb eclipselink mask data-masking

目前我们的网络项目需要匿名化一些数据 (例如,像432-55-1111这样的安全号码可能显示为432-55- * *) 这些数据可能包含电子邮件,ID,价格,日期等。

需要屏蔽的表名和列保存在DB中 我们正在使用spring security来判断用户是否可以查看数据 数据域对象(CMP)可以从SQL或JPQL(命名查询或本机查询)或JPA Load方法或大型机获取。

我们需要找到一种最有效的方式(不是数据库结束)来动态屏蔽这些数据。
如果我们在EJB方法结束时使用拦截器,我们需要注释所有的Object(DTO) 和所有列。这可能效率低下。
任何正文都知道如何在完成SQL执行和命名查询(本机查询)时调用方法(如拦截器),并且我们可以通过查询和用户ID调用方法来屏蔽结果。

或其他方式。

将此设置在最低级别会很好,因此报告等其他应用程序不需要单独的解决方案。

我们项目的架构是JSF + Spring + EJB 3.0 + JPA 1.0。我们有很多web项目。
对于JPA,一些项目使用EclipseLink 2.2,有些项目使用Hibernate。

更新: 有关我们项目的更多信息。我们有很多关于不同特征的web项目。所以我们有很多与之相关的ejb项目。每个ejb都有DAO通过调用JPQL获取他们的CMP或得到(class,primarykey)metod.Like如下:

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);

新的EJB服务代码转换器将数据从CMP转换为DTO 转换器如下:

/**
 * 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。还有一些域服务用于搜索延迟paing,它们也不使用转换器。

我们希望在CMP转换为DTO之前屏蔽数据。

3 个答案:

答案 0 :(得分:1)

某些数据库(SQL Server或Oracle)已包含实现DDM功能,但您可以使用一些可以屏蔽网络级数据的工具。在这种情况下,您无需更改您的应用程序。 DDM有几个产品,如

和其他

答案 1 :(得分:0)

您可以尝试EntityListener使用@PostLoad注释拦截实体加载到持久化上下文中。

否则,可以在我认为适合屏蔽/格式化等的访问方法(getter / setter)中尝试。

修改(基于评论和问题更新)

您可以跨应用程序共享实体/ DTO

public String getSomethingMasked(){

   return mask(originalString);
}
  • 数据检索模式在各应用程序之间并不一致。如果所有应用程序都使用相同的数据库,则必须进行通用化。用不同的工具再次写同样的东西是没有意义的。之后每个应用程序都可能应用业务逻辑。

    或许,您可以拥有一个单独的项目,用于与数据库和数据库进行交互。然后将其包含在其他应用中以供进一步使用。所以改变任何东西,调试,增强等都是一个共同点。

  • 您使用的是Eclipselink,Hibernate&amp;其他自定义方式获取数据&amp;你需要最少的解决方法,从我的角度来看似乎很困难。

    要么集中数据检索,要么在可能的情况下单独进行更改,我认为这是不可行的,会影响一致性。

答案 2 :(得分:0)

在这种情况下,您可以拦截JSF的转换fase。此解决方案适用于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 "";
    }

}