【发布时间】:2021-08-14 00:34:47
【问题描述】:
我们有两种类型的注解。一个指定 Authz 检查,另一个明确指定不进行:@AuthZCheck(type=...) 和 @NoAuthZCheck。
有没有办法要求方法上至少有一个注释,否则会导致某种(最好是)编译时错误?
// this is ok
@AuthZCheck
public void getSensitiveInfo()
// this is ok
@NoAuthZCheck
public void getPublicInfo()
// this is NOT ok
public void getInfo()
编辑1 澄清一下,这与其说是功能问题,不如说是政策问题。我们允许其他开发人员编写这些方法,我们希望他们仔细考虑它需要哪种类型的 AuthZ 检查。其中一些确实不需要 AuthZ 检查,因为它是一个公共 API,或者因为后端服务自己进行 AuthZ 验证。 但是我们发现开发人员不加考虑就忽略了 AuthZ 检查的情况。他们可能已经复制粘贴了另一种不需要它的方法,而没有考虑甚至不知道 AuthZ 检查功能。 我们想结束这种做法并要求一个明确的 AuthZ 注释,即使在不需要 AuthZ 时也是如此。
【问题讨论】:
-
不确定编译时错误,但是对于运行时错误,构造函数可以通过反射获取所有方法上的所有注释,如果没有任何注释,或者需要的注释,抛出一个例外。或者检查注释的单元测试也可以协调这一点并产生构建错误
-
运行时反射会影响性能。此代码位于我们的边缘网关中,因此如果可能,希望避免这种情况。单元测试是一个有趣的选项,但需要开发人员编写它
-
您可以将当前的@AuthZCheck 行为设置为未注释方法的默认行为。
-
@tgdavies 我仍然需要一种方法来要求 AuthZCheck 以确保有人不会忘记它
-
当你调用一个没有注解的方法时,只要 AuthZCheck 做任何事情。
标签: java spring annotations