我需要做一个非常简单的任务:当我的Spring上下文的特定bean正在初始化时,我需要扫描Spring bean的整个上下文,至少有一个用PreAuthorize
注释的方法。对于使用PreAuthorize
注释的每个方法,我将扫描谓词以获取我感兴趣的特定Spring表达式(定义为自定义Spring表达式)。
该表达式将用于构造权限对象的集合
实施例
@Component
public class Foo{
@PreAuthorize("hasRole('ADMIN') || hasMyCustomToken('ABCDE')")
public void foo(){}
}
@Component
public class Bar{
@PreAuthorize("hasMyCustomToken('FGHIJ')")
public void bar(){}
}
在上下文中扫描所有可能的表达式参数之后,我将创建一个Set<String> allTokensInMyCodebase = {"ABCDE","FGHIJ"}
。
我知道我可以获得all beans with an annotation的列表,但只扫描类中的注释。相反,我需要获得所有bean方法。
我也知道这是不常见的做法,因为Spring Security(和Tx,对于@Transactional)在运行时使用AOP拦截带注释的方法,只有在调用该方法时。毕竟,授权表达式通常只应在运行时评估,而不是在上下文启动时评估。
也许我可以尝试针对每个 bean扫描上下文并反思所有方法。
有更聪明的方法吗?我的老板谈到了注释处理,但我找不到任何方法级别的Spring注释处理文档,但AOP除外,AOP只是及时运行而不是提前运行(ahead
=== context start)