我有以下 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 函数?
最佳答案
我想说这是 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/