春のセキュリティ(4):カスタム設定

その後、祭りはあなたには、いくつかの設定をカスタマイズする必要がある場合@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とUserDetailsS​​erviceです。

    保護された 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をUserDetailsS​​erviceし、構築するために)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:上 }

【注意】フレームワークはパスワードが必要ですので、ここで、暗号化に加え、関連するパスワードエンコードをサポートする必要があります。

 

だから、どのようにこのコードUserDetailsS​​erviceとUserDetailsそれを生成するには?次のようにプロセスは以下のとおりです。

[1] 、InMemoryUserDetailsManagerConfigurerを作成InMemoryUserDetailsManagerConfigurerコンストラクタを呼び出すための呼び出しAuthenticationManagerBuilder inMemoryAuthentication()メソッドを作成する InMemoryUserDetailsManager(すなわちUserDetailsS​​ervice実装クラス)(、そして最終的に、親クラスの層スルー > AbstractDaoAuthenticationConfigurer - > UserDetailsManagerConfigurer - - > UserDetailsS​​erviceConfigurer InMemoryUserDetailsManagerConfigurer提供)でAbstractDaoAuthenticationConfigurerに与えられました。

    公共 InMemoryUserDetailsManagerConfigurer <AuthenticationManagerBuilder> inMemoryAuthentication()は
             スロー例外{
         リターン(適用新しい InMemoryUserDetailsManagerConfigurerを<> ()); 
    }
    パブリックInMemoryUserDetailsManagerConfigurer(){
         スーパー新しい InMemoryUserDetailsManager(新規のArrayList <> ()))。
    }
    保護AbstractDaoAuthenticationConfigurer(U userDetailsS​​ervice){
         この .userDetailsS​​ervice = userDetailsS​​ervice。
        provider.setUserDetailsS​​ervice(userDetailsS​​ervice)。
        もし(userDetailsS​​ervice instanceofのUserDetailsPasswordService){
             この.provider.setUserDetailsPasswordService((UserDetailsPasswordService)userDetailsS​​ervice)。
        } 
    }

[2] 呼び出し AuthenticationManagerBuilderアプライ)(方法設定 [1]〜defaultUserDetailsS​​erviceを InMemoryUserDetailsManagerと[1]親に加えInMemoryUserDetailsManagerConfigurerのAbstractConfiguredSecurityBuilder configurersリスト内

    プライベート <Cは、拡張 UserDetailsAwareConfigurer <AuthenticationManagerBuilderは、?延び UserDetailsS​​ervice >> C適用(
            Cコンフィギュア)がスロー例外{
         この .defaultUserDetailsS​​ervice = configurer.getUserDetailsS​​erviceを();
        リターン(C)スーパー.apply(コン); 
    }

[3] withUserのコール親クラスUserDetailsManagerConfigurer InMemoryUserDetailsManagerConfigurer()メソッドで複数のUserDetailsBuilder生成する userBuilders の一覧

    公共 最終UserDetailsBuilder withUser(文字列名){ 
        UserDetailsBuilder userBuilder = 新しい UserDetailsBuilder((C))。
        userBuilder.username(ユーザー名); 
        この.userBuilders.add(userBuilder)。
        返すuserBuilderを。
    }

[4] コールDefaultPasswordEncoderAuthenticationManagerBuilderビルド()メソッドが呼び出される場合

    [4.1] 設定()メソッドを呼び出すUserDetailsS​​erviceConfigurer

    @Override
     公共 ボイド設定(Bビルダー)がスロー例外{ 
        initUserDetailsS​​erviceを(); 
        スーパー.configure(ビルダー)。
    }

    [4.2] 呼び出しのUserDetailsManagerConfigurerinitUserDetailsS​​ervice()メソッド[3]作成userBuildersユーザーオブジェクト(UserDetails実装クラスおよび[1]から入手UserDetailsS​​ervice AbstractDaoAuthenticationConfigurer、およびUserDetailsS​​erviceにUserDetailsいます。

    @Overrideは、
     保護された ボイド()initUserDetailsS​​erviceをスロー例外{
         ため(UserDetailsBuilder userBuilder:userBuilders){ 
            。getUserDetailsS​​ervice()のcreateUser(userBuilder.build())。
        } 
        のための(UserDetailsのuserDetails:この.users){ 
            。getUserDetailsS​​ervice()の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 UserDetailsS​​erviceとユーザーを作成するために、実装クラスDefaultPasswordEncoderAuthenticationManagerBuilder AuthenticationManagerBuilderを使用して設定します(AuthenticationManagerBuilder払い)をカバーし、システムが実装クラスDaoAuthenticationProvider AuthenticationProviderを作成するために、私たちにデフォルト設定されます。しかし、私たちは、これらのオブジェクトは、春の豆ではないことがわかりました。だから我々は、このメソッドをオーバーライドすることができますし、豆のプロジェクトと使用中に注入できるように、ビーンとして宣言されています。

    @Bean(名= "myAuthenticationManager" 
    @Override 
    公衆 AuthenticationManager authenticationManagerBean()はスロー{例外を
         返す スーパー)(.authenticationManagerBean。
    }

AuthenticationManagerエージェントを作成している、あなたが呼び出すときに、実際には、親クラスのソースコードを見ることができます。

    公共 AuthenticationManager authenticationManagerBean()がスロー例外{
         戻り 新しいAuthenticationManagerDelegator(authenticationBuilder、コンテキスト)。
    }

 

(5)userDetailsS​​erviceBean()

和(4)类似、Beanとして設定(AuthenticationManagerBuilder)から作成UserDetailsS​​erviceを露出させるために、このメソッドをオーバーライドします。一般的なだけthefollowingオーバーライドでは、この方法を実行する必要があります。

    @Bean(名= "myUserDetailsS​​ervice" 
    @Override 
    公衆 UserDetailsS​​ervice userDetailsS​​erviceBean()はスロー{例外を
         返す スーパー)(.userDetailsS​​erviceBean。
    }

 

(6)UserDetailsS​​ervice

 

おすすめ

転載: www.cnblogs.com/storml/p/10968797.html