出于安全考虑,如果以某种方式编写代码,是否有办法使代码失败?

时间:2014-08-21 23:36:27

标签: java maven jpa

我在项目中使用JPA和Maven。编写执行此操作的代码是可能的,但在语义上是错误的:

entityManager.find(EntityWithRestrictedData.class, key);

entityManager.findAll(EntityWithRestrictedData.class);

该项目已经有了应该使用的代码:

getEntityWithRestrictedDataONLYIfYouHaveAccess(key, user);

如果有人使用实体管理器直接查找受限数据,有没有办法让构建失败?

请注意,在我的项目中,还有其他完全正确的理由可以使用findfindAll,而不是使用EntityWithRestrictedData

编辑:此问题可能与此问题重复,How to make a maven build fail if source code contains a keyword / regex

1 个答案:

答案 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,但(我认为)这里唯一相关的是可见性检查。因此,您必须使被调用的类,被调用的方法或传递的类不可用于一般用途。您无法控制EntityManagerfindAll()可见度。因此,唯一剩下的就是让亚历山大建议的方式使EntityWithRestrictedData无法使用。强制与此实体的交互发生在服务之后。

在这种情况下,我很高兴听到忽略了这种可能性。