目前我们的网络项目需要匿名化一些数据
(例如,像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之前屏蔽数据。
答案 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 "";
}
}