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

vm0i2vca  于 2023-01-19  发布在  Spring
关注(0)|答案(2)|浏览(171)

我有以下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函数?

sy5wg1nm

sy5wg1nm1#

我想说这是IntelliJ IDEA的问题,与Spel中的函数支持完全无关:
可以通过注册可在表达式字符串中调用的用户定义函数来扩展SpEL。
从Spel、Spring框架或Sping Boot 方面没有什么可做的,因为所有您需要的都已经通过您的CustomMethodSecurityExpressionRoot存在了。
WARN中的内容只是一个指针,指示有关SpEL评估上下文的根对象的IDEA知识超出了您的自定义CustomMethodSecurityExpressionRoot范围。
您可能会像#this.isTeamMember(#obj)#root.isTeamMember(#obj)这样做,以获得相同的结果,但同样:根本就没有什么关于函数的东西。别把自己搞糊涂了。

vuktfyat

vuktfyat2#

希望新版本的Intellij IDEA 2022. 3. 1能解决这个问题。如果您正在使用Itellij,请升级到最新版本。

相关问题