spring - 将自定义 SecurityExpressionOperations 中的方法注册为 Spring SpEL 函数

标签 spring spring-boot spring-security spring-el

我有以下 MethodSecurityExpressionOperations 实现

public class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot implements MethodSecurityExpressionOperations {
        private Object filterObject;
        private Object returnObject;

        CustomMethodSecurityExpressionRoot(Authentication authentication) {
          super(authentication);
        }

        public boolean isTeamMember(Job job) {
          //very interesting logic
        }

        @Override
        public Object getFilterObject() {
          return this.filterObject;
        }

        @Override
        public Object getReturnObject() {
          return this.returnObject;
        }

        @Override
        public Object getThis() {
          return this;
        }

        @Override
        public void setFilterObject(Object obj) {
          this.filterObject = obj;
        }

        @Override
        public void setReturnObject(Object obj) {
          this.returnObject = obj;
        }
    }

如您所见,我有一个名为 isTeamMember 的自定义方法。此方法已通过以下预授权注释成功评估:@PreAuthorize("isTeamMember(#job)"),但不幸的是,它未解析为 Spring SpEL 函数。

see the warning

是否有 Spring Bootish 自动方式将 isTeamMember 注册为 SPeL 函数?

最佳答案

我想说这是 IntelliJ IDEA 的问题,与 Function 完全无关。 SpEL 支持:

You can extend SpEL by registering user defined functions that can be called within the expression string.

SpEL、Spring Framework 或 Spring Boot 方面无需执行任何操作,因为您所需要的一切都已通过 CustomMethodSecurityExpressionRoot 提供。

您的 WARN 中的内容只是一个指针,表明有关 SpEL 评估上下文的根对象的 IDEA 知识超出了您的自定义 CustomMethodSecurityExpressionRoot 范围。

您可以这样做 #this.isTeamMember(#obj)#root.isTeamMember(#obj) 以获得相同的结果,但同样:有与函数无关。别把自己搞糊涂了。

关于spring - 将自定义 SecurityExpressionOperations 中的方法注册为 Spring SpEL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45673908/

相关文章:

spring-boot - 使用嵌入式 Tomcat 启动 Spring Boot 应用程序时,如何配置堆大小?

spring-security - Feign 和 Spring Security 5 - 客户端凭据

android - 保护 Spring RESTful Web 服务 API 免受未经授权的访问?

java - 回滚 Spring 3.1 缓存或驱逐

java - 如何通过多个可能值找到实体列表(使用或在 Spring Data 中)

java - 在 Spring Boot 中转换为 Collection 时如何防止 Spring MVC 解释逗号?

java - spring jsp View 中使用的数据绑定(bind)是什么

java - Springboot cors 当allowCredentials为true时,allowedOrigins不能包含特殊值 "*",但我不认为我在任何地方设置了 `*`

java - 如何使用 Spring Batch 读取/写入 zOS(大型机)平面文件

java - 如何仅为用户自己的端点启用请求