UnsupportedOperationException异常javax.servlet.ServletRequest.getServerName()不支持
我想一个CustomWebSecurityExpressionRootUnsupportedOperationException异常javax.servlet.ServletRequest.getServerName()不支持
request.getServerName()
这里中访问HttpServletRequest.getServerName()是我的代码:
public class CustomWebSecurityExpressionRoot extends WebSecurityExpressionRoot {
public CustomWebSecurityExpressionRoot(Authentication a, FilterInvocation fi) {
super(a, fi);
}
public boolean isLocal() {
return "localhost".equals(request.getServerName());
}
}
此表达式根目前正在FilterSecurityInterceptor中设置
@Override
public void configure(final WebSecurity web) throws Exception {
final HttpSecurity http = getHttp();
web.postBuildAction(() -> {
FilterSecurityInterceptor fsi = http.getSharedObject(FilterSecurityInterceptor.class);
fsi.setSecurityMetadataSource(metadataSource);
web.securityInterceptor(fsi);
});
}
然后,我有一个数据库条目设置“本地和hasRole(”ADMIN“)”它调用此表达式。
看起来有代理包装ServletRequest作为“DummyRequest”,并且所有其他方法都不受支持。
但是,当这个被执行,我得到以下错误:
java.lang.UnsupportedOperationException: public abstract java.lang.String javax.servlet.ServletRequest.getServerName() is not supported
at org.springframework.security.web.UnsupportedOperationExceptionInvocationHandler.invoke(FilterInvocation.java:235) ~[spring-security-web-4.2.3.RELEASE.jar:4.2.3.RELEASE]
at com.sun.proxy.$Proxy134.getServerName(Unknown Source) ~[na:na]
at javax.servlet.ServletRequestWrapper.getServerName(ServletRequestWrapper.java:207) ~[tomcat-embed-core-8.5.16.jar:8.5.16]
这里是一个另类
创建接收到请求的参数
@Component
public class WebChecker {
public boolean isLocalHost(Authentication authentication, HttpServletRequest request) {
System.out.println("Server name" + request.getServerName());
return "localhost".equals(request.getServerName());
}
}
然后在一个简单的bean您的安全配置可以通过访问配置调用isLocalHost方法作为表达式,如下所示:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/stores").access("@webChecker.isLocalHost(authentication,request)")
有春天公报网站26.2.1 Referring to Beans in Web Security Expressions
希望更多的信息,这种替代可以帮助你。
这是一个很好的选择,但我得到了同样的问题“java.lang.UnsupportedOperationException:public abstract java.lang.String javax.servlet.ServletRequest.getServerName()is not supported。”。为什么有一个代理包装这个请求? –
好的,如果您尝试使用可以帮助您的常见内置表达式,例如“hasRole('admin')和hasIpAddress('127.0.0.0/24')” –
Daniel,抱歉,但我需要一个自定义表达式来检查请求是否来自特定的serverName,因为它应该在servletRequest中可用,但它已被代理,并且不可用:-( –
有一个问题,从哪里调用isLocal()方法?它是否构成拦截器?你能分享那部分吗?并且'CustomWebSecurityExpressionRoot'是一个组件?被注射? –