質問
Spring Bootを使って開発をしており、Spring Securityを使ったログインについて、ネットに書かれているコードなどを見ながら調べています。
Spring Securityでは認証に際してWebSecurityConfigAdapterを継承したクラスを実装し、以下のようなコードを書くと思います。ここではコードの下部においてGlobalAuthenticationConfigurerAdapterを継承するインナークラスを使っていますが(別のファイルに書いているコードもありました)、この部分について質問があります。
Java
1@Configuration 2@EnableWebMvcSecurity 3public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 4 5 @Override 6 protected void configure(HttpSecurity httpSecurity) throws Exception 7 { 8 // 認可の設定 9 httpSecurity 10 .authorizeRequests() 11 .antMatchers("/login").permitAll() 12 .anyRequest().authenticated(); 13 14 // ログイン設定 15 httpSecurity 16 .formLogin() 17 .loginProcessingUrl("/login") 18 .loginPage("/login") 19 .failureHandler(new SampleAuthenticationFailureHandler()) 20 .usernameParameter("username") 21 .passwordParameter("password") 22 .defaultSuccessUrl("/") 23 .and(); 24 25 // ログアウト設定 26 httpSecurity 27 .logout() 28 .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) 29 .logoutSuccessUrl("/login"); 30 } 31 32 @Configuration 33 protected static class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter { 34 @Autowired 35 UserDetailsService userDetailsService; 36 37 @Override 38 public void init(AuthenticationManagerBuilder auth) throws Exception { 39 // 認証するユーザーを設定する 40 auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder()); 41 } 42 } 43}
上記のコードでは、GlobalAuthenticationConfigurerAdapterを継承するクラスを実装し、init()という関数をオーバーライドすれば動くのか、となんとなくわかるのですが、下記のようなコードも見られることがわかりました。(最後のconfigureGlobal()以外の部分は同じです)
Java
1@Configuration 2@EnableWebMvcSecurity 3public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 4 5 @Override 6 protected void configure(HttpSecurity httpSecurity) throws Exception 7 { 8 // 認可の設定 9 httpSecurity 10 .authorizeRequests() 11 .antMatchers("/login").permitAll() 12 .anyRequest().authenticated(); 13 14 // ログイン設定 15 httpSecurity 16 .formLogin() 17 .loginProcessingUrl("/login") 18 .loginPage("/login") 19 .failureHandler(new SampleAuthenticationFailureHandler()) 20 .usernameParameter("username") 21 .passwordParameter("password") 22 .defaultSuccessUrl("/") 23 .and(); 24 25 // ログアウト設定 26 httpSecurity 27 .logout() 28 .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) 29 .logoutSuccessUrl("/login"); 30 } 31 32 @Autowired 33 public void configureGlobal(AuthenticationManagerBuilder auth, UserDetailsService userDetailsService) throws Exception { 34 auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder()); 35 } 36}
この書き方だと、configureGlobal()は他のメソッドをオーバーライドしたりしているわけでもないように見え、どのタイミングでどう呼ばれるのかすら不明なのですが、なぜこのコードで問題なく動くのか、わかる方がいらっしゃれば教えていただけると助かります。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー