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

时间:2017-08-14 11:51:29

标签: 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函数?

1 个答案:

答案 0 :(得分:1)

我认为这是IntelliJ IDEA的关注点,与SpEL中的Function支持完全无关:

  

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

从SpEL,Spring Framework或Spring Boot方面无需做任何事情,因为您已经通过CustomMethodSecurityExpressionRoot已经完成了所有工作。

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

你可能会喜欢这个#this.isTeamMember(#obj)#root.isTeamMember(#obj)来获得相同的结果,但是又一次:没有关于fucntions的内容。不要混淆自己。