我在项目中使用JPA和Maven。编写执行此操作的代码是可能的,但在语义上是错误的:
entityManager.find(EntityWithRestrictedData.class, key);
或
entityManager.findAll(EntityWithRestrictedData.class);
该项目已经有了应该使用的代码:
getEntityWithRestrictedDataONLYIfYouHaveAccess(key, user);
如果有人使用实体管理器直接查找受限数据,有没有办法让构建失败?
请注意,在我的项目中,还有其他完全正确的理由可以使用find
和findAll
,而不是使用EntityWithRestrictedData
。
编辑:此问题可能与此问题重复,How to make a maven build fail if source code contains a keyword / regex
答案 0 :(得分:1)
我认为亚历山大在评论中提出的方法将是正确的方法,通过消除过程进行推理。这就是我的想法。
候选方法:(1)静态分析,(2)编译时执行,(3)运行时执行。在这三个中我认为只有(2)在这里是可行的。
静态分析:静态分析不起作用,因为人们总是可以做
之类的事情ReflectionUtils.invoke(
myEM,
myFindAllMethod,
Class.forName("x.y.EntityWithRestrictedDat" + "apple".substring(0, 1)));
运行时强制执行:此外,运行时强制执行似乎也不可行,因为必须进行单元测试,这些单元测试都执行了违规代码并使用了适当的拒绝呼叫模拟。我认为你不能强迫这些东西。
编译时强制执行:这样就可以实现编译时强制执行。 The compiler performs various security checks,但(我认为)这里唯一相关的是可见性检查。因此,您必须使被调用的类,被调用的方法或传递的类不可用于一般用途。您无法控制EntityManager
或findAll()
可见度。因此,唯一剩下的就是让亚历山大建议的方式使EntityWithRestrictedData
无法使用。强制与此实体的交互发生在服务之后。
在这种情况下,我很高兴听到忽略了这种可能性。