私はアプリケーションの起動時に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"を調べる必要があります。これをどうすれば解決できますか?前もって感謝します。
ご回答ありがとうございます。ちょうど理解するために、私はこのメソッド連鎖でキャスティングを追加できますか? – arunan
Javaコードの場合と同じです。 HttpSecurityクラスを中括弧で置き、メソッドを呼び出すvaleの前に置きます。 –