その後、祭りはあなたには、いくつかの設定をカスタマイズする必要がある場合@EnableWebSecurityノートを追加した後、必要と継承され、言うWebSecurityConfigurerAdapter特定のメソッドをカバーした後。
私たちは、あなたが書き換える必要があり、メソッドをオーバーライドすることができるWebSecurityConfigurerAdapterを見て。
(1)WebSecurity社
デフォルトでは、一般的に書き換えることがないだろう、空のメソッドです。
公共 ボイド設定(WebSecurity社のウェブ)がスロー} {例外
(2)HttpSecurity
すべての要求が認証を必要とするデフォルトの親コードのデフォルトは、HTTP基本認証を使用して、デフォルトのログインページのフォームベース認証を使用します。
保護された ボイド configureは(HttpSecurity HTTP)スロー例外{ HTTP .authorizeRequests() .anyRequest()(認証)。 .AND() .formLogin()および()。 .httpBasic(); }
ここではいくつかのカスタム言葉遣いです。
@Override 保護 のボイド configureは(HttpSecurity HTTP)スロー例外{ // @formatterを:オフ http.authorizeRequests() // すべてのユーザーがこれらのURLにアクセスしてい .antMatchers( "/リソース/ **"、 "/サインアップ"、「を/ 」).permitAll() // /管理/で始まる任意のURLは"ROLE_ADMIN ""ロールを持つユーザーに制限されます" .antMatchers( "/管理/ **")。hasRoleも( "ADMIN"を) / / 「/ DB /」「ROLE_ADMIN」と「ROLE_DBA」の両方を持っているユーザーが必要ですから始まる任意のURL .antMatchers( "/ DB / **")。アクセス( "hasRoleも( 'ADMIN')とhasRoleも( 'DBA')" ) // "/ group_a /"「ROLE_ADMINの両方を持っているユーザーが必要ですから始まる任意のURL "または"ROLE_GROUP_A" .antMatchers(" /管理/ ** ")。hasAnyRole(" ADMIN」、 "GROUP_A" ) // すでにユーザーのみが認証されている必要がありますに一致していない任意のURL ).anyRequest(。認証された() .AND()。formLogin() // すべてのユーザーがカスタムログインページにアクセスしてい .loginPage( "/ログイン" ).permitAll() .AND()。ログアウト() // ログアウトURLをカスタマイズ .logoutUrl( "/私/ログアウト") // ログアウト成功URLをカスタマイズ .logoutSuccessUrl( "/私/インデックス" ) // カスタムLogoutSuccessHandlerを指定します。これが指定されている場合は、logoutSuccessUrl()は無視され .logoutSuccessHandler(logoutSuccessHandlerを) // ログアウト時のHttpSessionを無効にします。これがデフォルトでtrueです (.invalidateHttpSession 真) // LogoutHandlerを追加します。SecurityContextLogoutHandlerは、デフォルトでは、最後のLogoutHandlerとして追加され .addLogoutHandler(logoutHandler) // ログアウト成功を削除するクッキーの名前を指定できます .deleteCookies() .AND()。リメンバー・ミー() // 私の機能と有効な日付を覚えています。 .KEY( "uniqueAndSecret" ) .tokenValiditySeconds( 60 * 60 * 24 * 7 )。 // @formatter:上 }
(3)AuthenticationManagerBuilder
デフォルトでは、このように書かれています:
保護された ボイドを設定(AuthenticationManagerBuilderのAUTH)がスロー例外{ この .disableLocalConfigureAuthenticationBldr = 真。 }
上記の分析1から、実際に自動的に設定されたデフォルトDefaultPasswordEncoderAuthenticationManagerBuilder BuilderとUserDetailsとUserDetailsServiceです。
保護された AuthenticationManager authenticationManagerは()スロー例外を{ 場合(!authenticationManagerInitialized){
// [1]如果覆盖ののconfigure()方法、则disableLocalConfigureAuthenticationBldr为偽
// [2]是默认的のconfigure()方法、disableLocalConfigureAuthenticationBldr还是真如果 のconfigure(localConfigureAuthenticationBldr ); もし(disableLocalConfigureAuthenticationBldr){ authenticationManager = authenticationConfiguration .getAuthenticationManager()。 // [2] } 他{ authenticationManager =localConfigureAuthenticationBldr.build(); // [1] } authenticationManagerInitialized =真。 } 戻りauthenticationManagerと、 }
カバーされている場合、彼らはまだ使用されているもののDefaultPasswordEncoderAuthenticationManagerBuilderを、私たちはUserDetailsManagerConfigurer(2つのサブクラスを使用することができInMemoryUserDetailsManagerConfigurer、JdbcUserDetailsManagerConfigurerをUserDetailsServiceし、構築するために)UserDetailsを。例えばInMemoryUserDetailsManagerConfigurer、以下では、カスタム文言です。
@Bean PasswordEncoder passwordEncoder(){ 戻りPasswordEncoderFactories.createDelegatingPasswordEncoder()。 } @Overrideが 保護 ボイド設定(AuthenticationManagerBuilderのAUTH)をスロー例外{ // オフ:@formatter // 戻りInMemoryUserDetailsManagerConfigurer PasswordEncoderエンコーダ= 新しいBCryptPasswordEncoder()。 auth.inMemoryAuthentication() // UserDetailsBuilderを作成しuserBuildersに追加 .withUser( "ユーザ")。パスワード( "{} bcryptの" + encoder.encode( "パス"))。役割( "USER" ) //はInMemoryUserDetailsManagerConfigurerを返す .AND() // 再度UserDetailsBuilderを作成しuserBuildersに追加
.withUser( "管理")。パスワード( "{} bcryptの" + encoder.encode( "パス"))。役割( "USER"、 "ADMIN" )。 // @formatter:上 }
【注意】フレームワークはパスワードが必要ですので、ここで、暗号化に加え、関連するパスワードエンコードをサポートする必要があります。
だから、どのようにこのコードUserDetailsServiceとUserDetailsそれを生成するには?次のようにプロセスは以下のとおりです。
[1] 、InMemoryUserDetailsManagerConfigurerを作成InMemoryUserDetailsManagerConfigurerコンストラクタを呼び出すための呼び出しAuthenticationManagerBuilder inMemoryAuthentication()メソッドを作成する InMemoryUserDetailsManager(すなわちUserDetailsService実装クラス)(、そして最終的に、親クラスの層スルー > AbstractDaoAuthenticationConfigurer - > UserDetailsManagerConfigurer - - > UserDetailsServiceConfigurer InMemoryUserDetailsManagerConfigurer提供)でAbstractDaoAuthenticationConfigurerに与えられました。
公共 InMemoryUserDetailsManagerConfigurer <AuthenticationManagerBuilder> inMemoryAuthentication()は スロー例外{ リターン(適用新しい InMemoryUserDetailsManagerConfigurerを<> ()); }
パブリックInMemoryUserDetailsManagerConfigurer(){ スーパー(新しい InMemoryUserDetailsManager(新規のArrayList <> ()))。 }
保護AbstractDaoAuthenticationConfigurer(U userDetailsService){ この .userDetailsService = userDetailsService。 provider.setUserDetailsService(userDetailsService)。 もし(userDetailsService instanceofのUserDetailsPasswordService){ この.provider.setUserDetailsPasswordService((UserDetailsPasswordService)userDetailsService)。 } }
[2] 呼び出し AuthenticationManagerBuilderアプライ)(方法設定 [1]〜defaultUserDetailsServiceを InMemoryUserDetailsManagerと[1]親に加えInMemoryUserDetailsManagerConfigurerのAbstractConfiguredSecurityBuilder configurersリスト内
プライベート <Cは、拡張 UserDetailsAwareConfigurer <AuthenticationManagerBuilderは、?延び UserDetailsService >> C適用( Cコンフィギュア)がスロー例外{ この .defaultUserDetailsService = configurer.getUserDetailsServiceを(); リターン(C)スーパー.apply(コン); }
[3] withUserのコール親クラスUserDetailsManagerConfigurer InMemoryUserDetailsManagerConfigurer()メソッドで複数のUserDetailsBuilder生成する userBuilders の一覧
公共 最終UserDetailsBuilder withUser(文字列名){ UserDetailsBuilder userBuilder = 新しい UserDetailsBuilder((C)本)。 userBuilder.username(ユーザー名); この.userBuilders.add(userBuilder)。 返すuserBuilderを。 }
[4] コールDefaultPasswordEncoderAuthenticationManagerBuilderビルド()メソッドが呼び出される場合
[4.1] 設定()メソッドを呼び出すUserDetailsServiceConfigurer
@Override 公共 ボイド設定(Bビルダー)がスロー例外{ initUserDetailsServiceを(); スーパー.configure(ビルダー)。 }
[4.2] 呼び出しのUserDetailsManagerConfigurerinitUserDetailsService()メソッド[3]作成userBuildersユーザーオブジェクト(UserDetails実装クラス)および[1]から入手UserDetailsService AbstractDaoAuthenticationConfigurer、およびUserDetailsServiceにUserDetailsいます。
@Overrideは、 保護された ボイド()initUserDetailsServiceをスロー例外{ ため(UserDetailsBuilder userBuilder:userBuilders){ 。getUserDetailsService()のcreateUser(userBuilder.build())。 } のための(UserDetailsのuserDetails:この.users){ 。getUserDetailsService()のcreateUser(userDetails)。 } }
ここではいくつかのカスタムの書き込みは以下のとおりです。
@Override 保護され 、ボイドのconfigure(AuthenticationManagerBuilder払い)がスロー例外{ // @formatter:オフ // 返しInMemoryUserDetailsManagerConfigurer auth.inMemoryAuthentication() // UserBuilderを作成し、userBuildersに追加します 。.withUser( "ユーザー")パスワード( "パスワード") .roles( "USER" ) // InMemoryUserDetailsManagerConfigurer返し .AND() //が再びUserBuilderを作成し、userBuildersに追加 .withUser( "管理者")。パスワード( "パスワード")。役割( "USER"、 "ADMIN」 ); // @formatter:上 }
(4)authenticationManagerBean()
我々は、我々はInMemoryUserDetailsManagerConfigurerことにより、独自の実装クラスInMemoryUserDetailsManager UserDetailsServiceとユーザーを作成するために、実装クラスDefaultPasswordEncoderAuthenticationManagerBuilder AuthenticationManagerBuilderを使用して設定します(AuthenticationManagerBuilder払い)をカバーし、システムが実装クラスDaoAuthenticationProvider AuthenticationProviderを作成するために、私たちにデフォルト設定されます。しかし、私たちは、これらのオブジェクトは、春の豆ではないことがわかりました。だから我々は、このメソッドをオーバーライドすることができますし、豆のプロジェクトと使用中に注入できるように、ビーンとして宣言されています。
@Bean(名= "myAuthenticationManager" ) @Override 公衆 AuthenticationManager authenticationManagerBean()はスロー{例外を 返す スーパー)(.authenticationManagerBean。 }
AuthenticationManagerエージェントを作成している、あなたが呼び出すときに、実際には、親クラスのソースコードを見ることができます。
公共 AuthenticationManager authenticationManagerBean()がスロー例外{ 戻り 新しいAuthenticationManagerDelegator(authenticationBuilder、コンテキスト)。 }
(5)userDetailsServiceBean()
和(4)类似、Beanとして設定(AuthenticationManagerBuilder)から作成UserDetailsServiceを露出させるために、このメソッドをオーバーライドします。一般的なだけthefollowingオーバーライドでは、この方法を実行する必要があります。
@Bean(名= "myUserDetailsService" ) @Override 公衆 UserDetailsService userDetailsServiceBean()はスロー{例外を 返す スーパー)(.userDetailsServiceBean。 }
(6)UserDetailsService