通过自定义实现@PreAuthorize注解获取调用方法信息

Get calling method information via custom implementation of @PreAuthorize annotation

您好,我们正在 SpringSecurity 上实施 ABAC(看起来与 Axiomatics 解决方案相同)。所以我们想定义客户表达和自定义底层机制。例如@PreAuthorize("myexpression").

此时我正在尝试了解如何获取有关目标方法(JoinPoint)的信息:名称、class、参数。我没有找到如何进行 Spring 安全自定义。

据我了解,其他解决方案可能是直接基于 AOP 的实现,例如@Around,但是我想首先尝试找出 Spring 安全性是否可以为我提供一种以某种方式自行获取 JoinPoint 的方法,它不是通过 AOP 实现的吗?

谁有例子,谢谢。

我建议在 Spring Security 5.6 和 @EnableMethodSecurity 中查看对 @PreAuthorize 的新支持。有关如何自定义拦截器的信息,请参阅 reference docs。根据您的要求,您可以在很多地方使用委派或使用您自己的实现完全替换组件来连接到此支持。

在您的情况下,最有可能的起点似乎是创建一个 @Bean 来替换 AuthorizationManagerBeforeMethodInterceptor:

    @Bean
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    Advisor preAuthorizeAuthorizationMethodInterceptor() {
        PreAuthorizeAuthorizationManager authorizationManager = new PreAuthorizeAuthorizationManager();
        authorizationManager.setExpressionHandler(...);
        return AuthorizationManagerBeforeMethodInterceptor.preAuthorize(authorizationManager);
    }

您将必须实施 MethodSecurityExpressionHandler,但您可以使用委托 re-use 和 DefaultMethodSecurityExpressionHandler 来处理您不想自己实施的任何事情。