在自定义注解中使用 spring 安全表达式

Posted

技术标签:

【中文标题】在自定义注解中使用 spring 安全表达式【英文标题】:Use spring security expressions in custom annotation 【发布时间】:2017-01-11 01:36:30 【问题描述】:

您好,我有一个带有 Spring Boot + Spring Security 的项目。 我正在构建一个我这样定义的自定义注释:

@Retention(RUNTIME)
@Target(METHOD)
public @interface CustomAnnotation 
   String condition();
   String[] fields() default ;

此注释将应用于类的方法。我希望“条件”参数是一个“弹簧安全表达式”,我将在一个评估表达式的方面进行评估,如果它是真的,它会做一些逻辑。

Aspect 定义如下:

@Pointcut("@annotation(customAnnotation)"  )
public void pointcutForCustomAnnotation(CustomAnnotation  customAnnotation) 
// Do nothing.


@Around("pointcutForCustomAnnotation(customAnnotation)")
public Object customAspect(ProceedingJoinPoint pjp, CustomAnnotation customAnnotation) throws Throwable   
     // Here should go the logic to evaluate spring security expression
    String condition = customAnnotation.condition();
    String[] fieldsToHide = customAnnotation.fields();

当我指的是 Spring 安全表达式时,我指的是在 @Preauthorize、@PostAuthorize、@PreFilter @PostFilter spring 注释中使用的那些。 例如:

hasRole('ROLE_USER')
isAuthenticated()

如何评估方面的弹簧安全表达式?我想我可以轻松地学习完成这项工作的 Spring 框架类

【问题讨论】:

【参考方案1】:

以下要点可以作为起点:

Programmatically check Spring Security expressions

它在 Grails 中针对相同问题的一些广告对我有用。 (我不得不更改表达式处理程序查找)

【讨论】:

以上是关于在自定义注解中使用 spring 安全表达式的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 自定义注解支持EL表达式(基于 MethodBasedEvaluationContext 实现)

2) SpringBootApplication注解详解

Spring Boot 在自定义类中使用组件? [关闭]

spring中自定义注解

使用 Spring“context-property-placeholder”在自定义 taglib 中获取配置设置

Spring - 在自定义注释中传递参数