2016-11-11 14 views
1

私はアプリケーションの起動時にJavaassistを使用してSpring-Security Java設定を注入しようとしている、春起動アプリケーションがあります。私はDBからの値から動的にjava設定を生成しています。 [ソース・エラー] authorizeRequests()org.springframework.security.config.annotationで見つかりません:ここではコード、javaassistを使用してSpringのセキュリティ設定コードを注入する

public class WarLock implements SpringApplicationRunListener { 
private final SpringApplication application; 

public WarLock(SpringApplication application, String[] args) throws IOException { 
    this.application = application; 
} 

@Override 
public void started() { 
    try { 
     System.out.println("Re-write security config called"); 
     rewriteSecurityConfigClass(); 
    } catch (NotFoundException | CannotCompileException e) { 
     e.printStackTrace(); 
    } 
} 

private void rewriteSecurityConfigClass() throws NotFoundException, CannotCompileException { 

    SecurityConfig config = new SecurityConfig(); 

    ClassPool cp = ClassPool.getDefault(); 
    cp.appendClassPath(new LoaderClassPath(application.getClassLoader())); 
    CtClass compiledClass = cp.get(config.getClass().getName()); 

    CtClass[] argClasses = { cp.get(HttpSecurity.class.getName()) }; 

    CtMethod method = compiledClass.getDeclaredMethod("configure",argClasses); 

    method.setBody("http .csrf().disable()     "+ 
      ".authorizeRequests()        "+ 
      " .antMatchers(\"/css/**\", \"/index\").permitAll() "+ 
      " .antMatchers(\"/user/**\").hasAuthority(\"USER\") "+ 
      " .antMatchers(\"/tryadmin\").hasAuthority(\"ADMIN\") "+ 
      " .antMatchers(\"/try\").hasAuthority(\"USER\")  "+ 
      " .and()           "+ 
      ".authenticationProvider(authenticationProvider()) "+ 
      " .exceptionHandling()       "+ 
      " .authenticationEntryPoint(entryPoint)   "+ 
      " .and()           "+ 
      ".formLogin()          "+ 
      " .usernameParameter(\"username\")     "+ 
      " .passwordParameter(\"password\")     "+ 
      " .successHandler(loginSuccessHandler)   "+ 
      " .failureHandler(loginFailureHandler)   "+ 
      " .and()           "+ 
      ".logout()           "+ 
      " .permitAll()         "+ 
      " .logoutRequestMatcher(new AntPathRequestMatcher(\"/login\", \"DELETE\")) "+ 
      " .logoutSuccessHandler(logoutSuccessHandler)        "+ 
      " .deleteCookies(\"JSESSIONID\")           "+ 
      " .invalidateHttpSession(true)           "+ 
      " .and()                 "+ 
      ".sessionManagement()              "+ 
      " .enableSessionUrlRewriting(true)          "+ 
      " .maximumSessions(1);              ");   

    compiledClass.toClass(); 

しかし、コードが失敗しながら起動、

javassist.CannotCompileExceptionです。 web.HttpSecurityBuilder

HTTPSecurityBuilderクラス内でauthorizeRequests()を探していますが、実際にはクラス "HttpSecurity"を調べる必要があります。これをどうすれば解決できますか?前もって感謝します。

答えて

1

Javassistはジェネリック型をサポートしていませんが、どのメソッドの削除も尊重します。 from the javadoc of CsrfConfigurerのように、disableメソッドはジェネリックなので、Javassistは間違った型を取って正しいメソッドを解決できません。

これを処理する唯一の方法は、残念なことにほぼすべてのステップであるSpring Security DSLの一般的なステップの後に適切な型キャスティングを追加することです。

この制限に悩まされない代替手段をお探しの場合は、私のライブラリByte Buddyをご覧ください。これは文字列ではなくコンパイルされたコードで動作し、この制限を受けません。

+0

ご回答ありがとうございます。ちょうど理解するために、私はこのメソッド連鎖でキャスティングを追加できますか? – arunan

+0

Javaコードの場合と同じです。 HttpSecurityクラスを中括弧で置き、メソッドを呼び出すvaleの前に置きます。 –

関連する問題