我有以下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函数?
2条答案
按热度按时间sy5wg1nm1#
我想说这是IntelliJ IDEA的问题,与Spel中的函数支持完全无关:
可以通过注册可在表达式字符串中调用的用户定义函数来扩展SpEL。
从Spel、Spring框架或Sping Boot 方面没有什么可做的,因为所有您需要的都已经通过您的
CustomMethodSecurityExpressionRoot
存在了。WARN中的内容只是一个指针,指示有关SpEL评估上下文的根对象的IDEA知识超出了您的自定义
CustomMethodSecurityExpressionRoot
范围。您可能会像
#this.isTeamMember(#obj)
或#root.isTeamMember(#obj)
这样做,以获得相同的结果,但同样:根本就没有什么关于函数的东西。别把自己搞糊涂了。vuktfyat2#
希望新版本的Intellij IDEA 2022. 3. 1能解决这个问题。如果您正在使用Itellij,请升级到最新版本。