2013-01-13 51 views
2

目前我们的网站项目需要匿名化部分数据。
(例如,像432-55-1111这样的安全号码可能显示为432-55- * *) 这些数据可能包含电子邮件,身份证,价格,日期等。
Web项目动态蒙版数据

需要被屏蔽的表格名称和列被保存在数据库中。
我们使用spring security来判断用户他是否可以看到数据。
数据域对象(CMP)可以从SQL或JPQL(名为query或native query)或JPA Load方法或Mainframe中获取。

我们需要找到一个最有效的方式(而不是DB端)来动态地屏蔽这些数据。
如果我们在EJB方法结束时使用拦截器,我们需要注释所有对象(DTO) 和所有列。这可能是低效率。
任何机构知道如何在完成SQL执行和命名查询(本机查询)执行时调用方法(如拦截器),并且我们可以调用一个方法来屏蔽查询和用户标识的结果。

或其他方式。

如果将其设置在最低级别,这将是一件好事,因此其他应用程序(如报表)不需要单独的解决方案。

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

更新: 有关我们项目的更多信息。我们有很多关于不同功能的web项目。所以我们有许多与它们相关的ejb项目。下面的ejb每一个具有DAO通过调用JPQL得到他们的CMP或得到(类的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服务代码转换器transfrom从数据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.Also转换用于搜索懒paing一些域名服务,他们也没有使用转换器。

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

+0

问:究竟你 “面具” 是什么意思? – paulsm4

+0

@ paulsm4表示将数据匿名化。 – FishGel

回答

0

您可以尝试使用EntityListener来截取实体加载到持久性上下文中的@PostLoad批注。

否则,可以在accesor方法(getter/setter)中尝试,我认为它适用于掩码/格式化等。

编辑:(基于评论&问题更新)

您可以在appications

public String getSomethingMasked(){ 

    return mask(originalString); 
} 
  • 数据检索模式共享实体/ DTO是不是跨应用程序一致。如果所有应用程序都使用相同的数据库,则必须进行推广。用不同的工具再次写同样的东西是没有意义的。之后每个应用程序可能会应用业务逻辑。

    也许,您可以有一个单独的项目,意在与数据库&进行交互,然后将其包含在其他应用程序中以供进一步使用。因此,这将是一个共同的点去改变什么,调试,增强等

  • 您正在使用的EclipseLink,Hibernate查询&你需要最少的解决办法,这从我的角度来看似乎很难获取数据&其他自定义方式。

    要么集中数据检索,要么尽可能单独进行更改,如果可能的话,我认为这是不可行的,影响一致性。

+0

'@PostLoad'只有在使用get(class,primarykey)方法时才会调用。我们有很多字段(使用getter/setter会导致太多工作) – FishGel

+0

@Richard不能引入调用查询的DAO图层方法,掩盖了结果和广泛应用的应用。 –

+0

我已更新该问题。 – FishGel

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 ""; 
    } 

} 
1

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