我有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函数解析。
是否有任何Spring Bootish自动方式将isTeamMember
注册为SPeL函数?
答案 0 :(得分:1)
我认为这是IntelliJ IDEA的关注点,与SpEL中的Function支持完全无关:
您可以通过注册可在表达式字符串中调用的用户定义函数来扩展SpEL。
从SpEL,Spring Framework或Spring Boot方面无需做任何事情,因为您已经通过CustomMethodSecurityExpressionRoot
已经完成了所有工作。
您在WARN中拥有的只是一个指针,表明IDEA对SpEL评估上下文的根对象的了解超出了您的自定义CustomMethodSecurityExpressionRoot
范围。
你可能会喜欢这个#this.isTeamMember(#obj)
或#root.isTeamMember(#obj)
来获得相同的结果,但是又一次:没有关于fucntions的内容。不要混淆自己。