目前我们的 Web 项目需要对一些数据进行匿名化处理。
(例如,像 432-55-1111 这样的安全号码可能显示为 432-55- * *)这些数据可能包含电子邮件、ID、价格、日期等。
需要屏蔽的表名和列保存在数据库中。
我们正在使用 spring security 来判断用户是否可以看到数据。
数据域对象(CMP)可以从 SQL 或 JPQL(命名查询或本机查询)或 JPA 加载方法或大型机中获取。
我们需要找到一种最有效的方式(而不是 DB 端)来动态屏蔽这些数据。
如果我们在 EJB 方法 end 使用拦截器,我们需要注释所有 Object(DTO) 和所有列。那可能是效率低下。
任何人都知道在完成 SQL 执行并执行命名查询(本机查询)时我们如何调用方法(如拦截器),并且我们可以调用方法以通过查询和用户 ID 来屏蔽结果。
或者其他方式。
最好将它放在最低级别,这样其他应用程序(如报告)就不需要单独的解决方案。
我们项目的架构是JSF+Spring+EJB 3.0+JPA 1.0。
我们有很多网络项目。
对于 JPA,一些项目使用 EclipseLink 2.2,一些项目使用 Hibernate。
更新:
关于我们项目的更多信息。我们有很多关于不同功能的 web 项目。所以我们有很多与之相关的 ejb 项目。每个 ejb 都有 DAO 通过调用 JPQL 或 get(class, primarykey) 方法来获取他们的 CMP。如下所示:
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。还有一些用于搜索懒惰的域服务,他们也没有使用转换器。
我们想在 CMP 转换为 DTO 之前屏蔽数据。