要約:オリジナルソース https://www.cnkirito.moe/spring-security-3/ 「徐」は予約済みの要約を転載することを歓迎、ありがとうございました!
春のセキュリティ春のセキュリティの設定を使用して、前の記事「春のセキュリティ(2)-Guides」には、分析を行うための構成に、この記事に私たちのアプリケーションを保護する方法を知っていることです。
3コア構成解釈
3.1特長
これは、入門ガイド設定項目春のセキュリティです。
@Configuration @EnableWebSecurity パブリック クラス WebSecurityConfigが拡張WebSecurityConfigurerAdapter { @Overrideは、 保護された 空のconfigure(HttpSecurity HTTP)スロー例外{ HTTP .authorizeRequests() .antMatchersを( "/"、 "/ホーム" ).permitAll() .anyRequest()。認証されました( ) .AND() .formLogin() .loginPage( "/ログイン" ) .permitAll() .AND() .logout() .permitAll(); } @Autowired 公共 のボイド configureGlobal(AuthenticationManagerBuilder払い)がスロー例外{ AUTH .inMemoryAuthentication() .withUser( "管理者")パスワード( "admin"を)の役割( "USER"。); } }
また、「/」、「/ホーム」(ホーム)、「/ログイン」(ログイン)、「/ログアウト」(償却)、他のパスが認証される必要があります。上記の設定javaconfigした後、我々のアプリケーションは、次のような機能を持っています。
- 不正なユーザが任意の保護されたリソースにアクセスしようとするとログインページに「/ログイン」パスを指定し、「/ログイン」にジャンプします。
- ページをログアウトするデフォルトの「/ログアウト」を指定します
- USERの役割を持つ管理者/ユーザー名やパスワードなどの管理を使用してユーザ認証装置におけるコンフィギュレーションメモリ、
- CSRF攻撃を防ぎます
- セッション固定 保護(セッションIDを改ざんから他人を防ぐため、春のセッションを説明するために私の以前の記事を参照してください)
- セキュリティヘッダー(ヘッダーと関連する一連の制御を追加します)
- HTTP厳格なトランスポートセキュリティの 安全な要求のための
- 統合されたX-Content-Typeの-オプション
- キャッシュ制御
- 統合X-XSS-保護- .aspxの)
- フレーム・オプションの統合-X-する予防に役立つ クリックジャッキング(アイフレームを。デフォルトは禁止されています)
- サーブレットAPIは、次のようにいくつかの方法が組み込まれて
3.2 @EnableWebSecurity
当社独自の定義の設定クラスWebSecurityConfigもWebSecurityConfigurerAdapterを継承し、@EnableWebSecurityコメントを追加しました。あなたはそれが実際に組み合わせたコメントで、より大きな役割だ人は、間違いなく、設定で決定的な役割を果たして@EnableWebSecurity不思議に思われるかもしれません。
@import({。WebSecurityConfiguration クラス、// <2> SpringWebMvcImportSelector。クラス })// <1> @EnableGlobalAuthentication // <3> @Configuration パブリック @のインタフェースEnableWebSecurity { ブールデバッグ()デフォルト はfalse 。 }
<1> SpringWebMvcImportSelector
アクションが、現在の環境がSpringMVCを含むかどうかを決定することである非ばねのばねセキュリティ環境として使用することができ、このアノテーションを使用するので、区別繰り返しのDispatcherServletを避けるために配置されています。@import注釈が含ま@EnableWebSecurity注釈活性化されたコンフィギュレーション・クラス:@import springboot外部導入するためのコメントを提供するように配置され、それはのように理解することができます。
<2> WebSecurityConfiguration
名前が示すように、次のセクションでは、セキュアなWebを構成するために、詳細ます使用されています。
<3> @EnableGlobalAuthentication
注釈付きソースを次のように
@import(AuthenticationConfiguration。クラス) @Configuration パブリック @のインタフェースEnableGlobalAuthentication { }
言い換えれば:@EnableWebSecurity完了した作業がWebSecurityConfiguration、AuthenticationConfigurationこれら2つのコア・コンフィギュレーション・クラスをロードされ、それがセキュリティ情報のセキュリティを設定するために業務のばね分離を有する、認証情報は、2つの部分で構成されています。@importで同じ点は、それが実際にAuthenticationConfigurationような構成クラスが認証関連コアクラスを構成するために使用される活性化することに留意されたいです。
WebSecurityConfiguration
この構成クラスでは、非常に重要な豆が登録されています。
@Configuration パブリック クラスWebSecurityConfiguration { // DEFAULT_FILTER_NAME = "springSecurityFilterChain" @Bean(名= AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME) 公衆フィルターspringSecurityFilterChain()がスロー例外{ ... } }
<! - 春のセキュリティ- > < フィルタ> < フィルタ名> springSecurityFilterChain </ フィルタ名> < フィルタクラス> org.springframework.web.filter.DelegatingFilterProxy </ フィルタリングクラス> </ フィルター> < フィルター-mapping > < フィルタ名> springSecurityFilterChain </ フィルタ名> < のurl-pattern > / * </ のurl-pattern > </ のfilter-mapping >
そして、統合springboot後、設定され、このようなXMLは、Javaで置換されています。WebSecurityConfigurationは声明springSecurityFilterChain役割に完成し、そして最終的にリクエストを傍受する責任このプロキシクラスは、(セキュリティフィルタリングを達成するために、スプリング、このクラスはDelegatingFilterProxy春のセキュリティパッケージではなく、Webパッケージにすることをプロキシモデルを確認しDelegatingFilterProxyしますデカップリング)。springboot前に使用していない、ほとんどの人が「springSecurityFilterChainは」という用語は不慣れではありませんする必要があり、彼は全体の認定入り口のフィルタスプリングセキュリティの中核です。、あなたは一度XML構成でweb.xmlに以下の設定を行い、春のセキュリティを有効にします:
AuthenticationConfiguration
@Configuration @import(ObjectPostProcessorConfiguration クラス) パブリック クラスAuthenticationConfiguration { @Bean 公共AuthenticationManagerBuilder authenticationManagerBuilder( ObjectPostProcessor <OBJECT> objectPostProcessor){ 戻り 新しいAuthenticationManagerBuilder(objectPostProcessor)を、 } 公共 AuthenticationManager getAuthenticationManager()スロー例外{ ... } }
3.3 WebSecurityConfigurerAdapterメインタスクAuthenticationConfiguration、それはグローバル認証マネージャAuthenticationManagerを生成する責任があります。「春のセキュリティ(a)の-Architecture概要」を忘れないでください、私たちはAuthenticationManagerは、Identity Managerの中核である、春のセキュリティの認証システムを導入します。
アダプタのモデルが広く春に使用され、給付の構成のアダプタを使用することは、我々が選択的に他の非関連する構成を覆うことなく、設定の一部を変更したい設定することができるということです。WebSecurityConfigurerAdapter私たちは、あなたが書き換えるために、修正したいコンテンツを選択することができ、そしてそれは3つのconfigureオーバーロードされたメソッドを提供しています、それが私たちの主な関心事です。
WebSecurityConfigurerAdapter中的のconfigure
あなたはそれがAuthenticationManagerBuilder、WebSecurity社、HttpSecurityパーソナライズされた構成で、それぞれのパラメータを知ることができます。
HttpSecurity一般的な構成
@Configuration @EnableWebSecurity パブリック クラス CustomWebSecurityConfigは拡張WebSecurityConfigurerAdapter { @Overrideは、 保護された 空のconfigure(HttpSecurity HTTP)スロー例外{ HTTP .authorizeRequests() (.antMatchers、 "/リソース/ **"、 "/サインアップ"を"/約" ).permitAll () .antMatchers( "/admin/**").hasRole("ADMIN" ) .antMatchers( "/db/**").access("hasRole('ADMIN ')とhasRoleも(' DBA ')" ) .anyRequest()。認証された() .AND() .formLogin() .usernameParameter( "ユーザ名" ) .passwordParameter( "パスワード" ) .failureForwardUrl( "/ログイン?エラー" ) .loginPage( "/ログイン" ) .permitAll() .AND() .logout() .logoutUrl ( "/ログアウト" ) .logoutSuccessUrl( "/インデックス" ) .permitAll() .AND() .httpBasic() .DISABLE(); } }
authorizeRequests(傍受する)構成パスは、役割、認証情報に対応するパスにアクセスするための権限を示しています。上記と(それぞれ、構成の根として一般的な構成のJava設定構成HttpSecurity、前記HTTPである)(終了タグのXML構成に相当)モジュールの構成に相当し、及び()HttpSecurity自体を返し、したがって、連続して設定することができます。その構成を意味することも、変数自体を通じて推測するのは非常に簡単です、
- 関連する構成フォーム認証に対応formLogin()
- ログアウトの構成に対応するログアウト()
- httpBasic()を使用すると、基本的なログインを設定することができます
- 等
彼らは例外なく、これらの構成項目は、コンフィギュラクラスを返され、すべてのHTTP設定がHttpSecurity mainメソッドを調べることで学ぶことができ、セキュリティの設定に関連するHTTPリクエストを表します。
http://kirito.iocoder.cn/QQ%E5%9B%BE%E7%89%8720170924223252.png
あなたは完全に、しかし、springboot春のセキュリティと使用するのに十分な自動設定をhttpプロトコルの構成のすべてを把握するためにはある程度の知識を持っている必要があります。それぞれが構成器(egFormLoginConfigurer、CsrfConfigurer)はHttpConfigurer設定項目の改良です。
WebSecurityBuilder
@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) throws Exception { web .ignoring() .antMatchers("/resources/**"); } }
AuthenticationManagerBuilder以笔者的经验,这个配置中并不会出现太多的配置信息。
@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("admin").password("admin").roles("USER"); } }
细心的朋友会发现,在前面的文章中我们配置内存中的用户时,似乎不是这么配置的,而是:想要在WebSecurityConfigurerAdapter中进行认证相关的配置,可以使用configure(AuthenticationManagerBuilder auth)暴露一个AuthenticationManager的建造器:AuthenticationManagerBuilder 。如上所示,我们便完成了内存中用户的配置。
@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth .inMemoryAuthentication() .withUser("admin").password("admin").roles("USER"); } }
アプリケーションでのみWebSecurityConfigurerAdapterがある場合、それらの間のギャップは無視することができ、メソッド名は、両者の違いから見ることができます。@AutowiredはAuthenticationManagerBuilderがグローバルアイデンティティで注入された使用、スコープは、複数のWebSecurityConfigurerAdapterにまたがることができます安全制御方法に影響と protected configure()
匿名内部クラスと同様に、その範囲限定内部WebSecurityConfigurerAdapter。この違いについては、参照は、私が提起した発行することができる春のセキュリティ#のissues4571を。公式文書は、複数のWebSecurityConfigurerAdapterシーンやデモの構成は、このシリーズの今後の記事で解釈されます示して
。