2017-08-28 13 views
0

がサポートされていません。私はHttpServletRequest.getServerNameにアクセスしようとしています()CustomWebSecurityExpressionRootにUnsupportedOperationException javax.servlet.ServletRequest.getServerNameは()

request.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 ")"この式を呼び出すデータベースエントリがあります。

「DummyRequest」としてServletRequestをラップするプロキシが存在し、他のすべてのメソッドはサポートされていないようです。

しかし、これが実行されますとき、私は次のエラーを取得する:

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

ここから1つの質問は、isLocal()メソッドと呼ばれていますか?それはインターセプターを形成していますか?その部分を分かち合うことができますか? 'CustomWebSecurityExpressionRoot'もコンポーネントですか?注射された? –

答えて

0

ここに1つの代替

はに続いて、パラメータとして

@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)") 

この代替はあなたを助け春Oficialサイト26.2.1 Referring to Beans in Web Security Expressions

ホープのより多くの情報があります。

+0

これは素晴らしい選択肢ですが、同じ問題 "java.lang.UnsupportedOperationException:public abstract java.lang.String javax.servlet.ServletRequest.getServerName()がサポートされていません"が表示されます。このリクエストをラップするプロキシがあるのはなぜですか? –

+0

大丈夫ですが、「hasRole( 'admin')やhasIpAddress( '127.0.0.0/24')」のような一般的な組み込み式を使用しようとすると「 –

+0

Daniel、申し訳ありませんが、私はカスタムが必要ですServletRequestで利用できるはずの特定のserverNameからリクエストが来ているかどうかを確認するための式ですが、プロキシされていて利用できません:-( –

関連する問題