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

2024-04-07

我有以下实现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 函数。

请参阅警告 https://i.stack.imgur.com/d1l8x.png

有没有Spring Bootish自动注册的方法isTeamMember作为 SPeL 函数?


我想说这是 IntelliJ IDEA 的问题,与Function http://docs.spring.io/spring/docs/current/spring-framework-reference/html/expressions.html#expressions-ref-functionsSpEL 支持:

您可以通过注册可在表达式字符串中调用的用户定义函数来扩展 SpEL。

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

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

你可以这样做#this.isTeamMember(#obj) or #root.isTeamMember(#obj)得到相同的结果,但再次强调:没有任何关于函数的内容。别把自己搞糊涂了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将自定义 SecurityExpressionOperations 中的方法注册为 Spring SpEL 函数 的相关文章

随机推荐