2017-08-28 105 views
0

我想一個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] 
+0

有一個問題,從哪裏調用isLocal()方法?它是否構成攔截器?你能分享那部分嗎?並且'CustomWebSecurityExpressionRoot'是一個組件?被注射? –

回答

0

這裏是一個另類

創建接收到請求的參數

@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

希望更多的信息,這種替代可以幫助你。

+0

這是一個很好的選擇,但我得到了同樣的問題「java.lang.UnsupportedOperationException:public abstract java.lang.String javax.servlet.ServletRequest.getServerName()is not supported。」。爲什麼有一個代理包裝這個請求? –

+0

好的,如果您嘗試使用可以幫助您的常見內置表達式,例如「hasRole('admin')和hasIpAddress('127.0.0.0/24')」 –

+0

Daniel,抱歉,但我需要一個自定義表達式來檢查請求是否來自特定的serverName,因爲它應該在servletRequest中可用,但它已被代理,並且不可用:-( –

相關問題