記事のディレクトリ
チャットは唖然とした後、そのための歌のGeマイクロ人事グループにパスワードを解読する方法を議論する前に、小さなパートナーの、私が参照してください。
私たちはこのプロジェクトに春のセキュリティ関連の依存性を導入するとどのような場合でも、私は!みんなと一緒に春のセキュリティ入門記事を、記述する必要があり、我々はログインフォームで始まるので、デフォルトでは、ログインフォームです。
以下は、ビデオ・ノートです。
新しいプロジェクトを作成します。1.
あなたが依存を作成すると、以下に示すように、まず、新しい春ブーツプロジェクト、春のセキュリティ依存性とウェブの導入を作成します。
[画像のダンプはチェーンが失敗し、発信局は、(IMG-Ur2YJrgF-1585095356039)直接アップロード(http://img.itboyhub.com//2020/03/spring-security-ダウン画像を保存することが推奨され、セキュリティチェーン機構を有していてもよいです2-1.png)]
プロジェクトが正常に作成された後、春のセキュリティは来た、私たちは春ブーツに参加加えることに依存しているspring-boot-starter-security
、それは主にこの二つあり、:
次のようにプロジェクトが正常に作成された後、我々はテストHelloControllerを追加し、読み取ります。
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "hello";
}
}
そして、何もしない、我々は直接プロジェクトを開始します。
プロジェクトの開始プロセスでは、我々は次のログ行が表示されます。
Using generated security password: 30abfb1f-36e1-446a-a79b-f70024f589ab
これは、UUIDの文字列で、ユーザーのデフォルトのユーザー生成の一時的なパスワードとして春のセキュリティです。
我々がアクセスするために行く次にhttp://localhost:8080/hello
インターフェイスを、あなたは自動的にログインページにリダイレクト見ることができます:
ログインページでは、デフォルトのユーザー名は、デフォルトのパスワードは、プロジェクトのパスワードのコンソール起動に印刷されているユーザがいる場合、ユーザー名とパスワードを入力し、その後、正常にログイン、ログインが成功すると、我々は/ハロー・インターフェースにアクセスすることができるようになりますA。
春のセキュリティ、それはインターフェースのデフォルトのログインページとログインでは/login
、他のポスト要求(ログイン・インターフェース)で、ちょうどget要求(ログインページ)です。
私たちは、非常に便利な、すべてのインターフェイスの保護への依存度を見ることができるように。
一部の人々はどのようにデフォルトのパスワードはUUID、それによって生成される知っている知っている、と言いますか?
これは実際には非常に適切な判断です。
内のユーザーに関連付けられている自動化されたコンフィギュレーション・クラスUserDetailsServiceAutoConfiguration
の内部では、この種のgetOrDeducePassword
アプローチは、我々は次のログ行を参照してください。
if (user.isPasswordGenerated()) {
logger.info(String.format("%n%nUsing generated security password: %s%n", user.getPassword()));
}
私たちはここからプリントアウトされたコンソール・ログに表示ことは間違いありません。真isPasswordGeneratedを返すメソッドを印刷条件は、そのパスワードはデフォルトで生成されます。
さらに、我々はuser.getPasswordがSecurityPropertiesに表示される、ことがわかった、SecurityPropertiesは、我々は次の定義を参照してください。
/**
* Default user name.
*/
private String name = "user";
/**
* Password for the default user name.
*/
private String password = UUID.randomUUID().toString();
private boolean passwordGenerated = true;
あなたは、デフォルトのユーザー名はユーザーで、デフォルトのパスワードはUUIDで、デフォルトでは、また真passwordGenerated見ることができます。
2. [ユーザーの構成]
デフォルトのパスワード一つの問題は、あなたが再起動するたびにプロジェクトが不便である、変更しなければならないということです。
前に正式にデータベース接続、ソングのGeを導入し、最初の二つの非主流のユーザー名/パスワードのスキームを導入。
2.1コンフィギュレーションファイル
私たちは、application.propertiesにデフォルトのユーザー名とパスワードを設定することができます。
どのようにそれを設定するには?我々はまだ我々はSecurityPropertiesで我々まず見て、それは私たちが自分のユーザー名とパスワードを定義したい場合は、必ずデフォルトの設定を上書きしようとしている、静的な内部クラスである内側SecurityPropertiesは、デフォルトのユーザーが定義されていた前のセクションを覚えています定義:
@ConfigurationProperties(prefix = "spring.security")
public class SecurityProperties {
これは非常に明確で、私たちは、ユーザー名・パスワードを定義するために接頭辞spring.security.userする必要があります。
spring.security.user.name=javaboy
spring.security.user.password=123
これは、定義された当社の新しいユーザー名とパスワードです。
最終セットメソッドのプロパティで定義されたユーザー名とパスワードは、プロパティ行く介して注入され、ここでは道SecurityProperties.User#のsetPassword方法下記を見て:
public void setPassword(String password) {
if (!StringUtils.hasLength(password)) {
return;
}
this.passwordGenerated = false;
this.password = password;
}
そして、私たちはここから見ることができ、定義されたパスワードapplication.propertiesは、注射の後に来たが、また、passwordGeneratedプロパティを設定する方法falseで、このプロパティをfalseに設定すると、コンソールはデフォルトのパスワードを印刷されません。
この再起動プロジェクトでは、あなたは自分のユーザー定義名/パスワードでログインすることができます。
2.2コンフィギュレーションクラス
上記の設定ファイルこの方法に加えて、我々はまた、構成クラスのユーザー名/パスワードを設定することができます。
コンフィギュレーションクラスコンフィギュレーションでは、我々はPasswordEncoderを指定する必要があり、これは非常に重要なものです。
精通していないいくつかのPasswordEncoderための小さなパートナーを考えると、私は最後に少しPasswordEncoderをご紹介するためにここにいるとやっています。セイPasswordEncoderは、パスワードの暗号化を開始する必要があります。
2.2.1なぜ暗号化
2011年12月21日、それは600万CSDNのユーザデータを含むWebデータベースに開示されたすべてのデータは平文で保存されている、それはユーザー名、パスワード、および電子メールアドレスが含まれています。チャンネル内の事件の後CSDNマイクロボーは、公式サイトおよびので、このデータベースのバックアップ・システムは、警察に報告されているため、原因不明のリークに、2009年に使用されていることを説明、声明を発表したが、後に公式サイトに謝罪の公開書簡を発表しました。次の10日間、金山、網易、Jingdongは、详细、シーナと他の企業は、この事件に関与しています。多くのユーザーは、Webサイトのパスワードの開示は偉大なセキュリティ上のリスクが発生しますので、複数のサイトには、パスワードを共有しているため、ほとんどのプレーンテキストで保存されたCSDNのユーザパスワードよりも衝撃的な何かです。本当にありがとうございました警告、我々はシステムを行っている、パスワードは暗号化されなければなりません。
漏れはまた、特にプログラマー・パスワードの過半数この1のために、いくつかの興味深いものを残しました。CSDNからの人々は、文書をリークしたように、以下のものなどいくつかの楽しみのパスワードを見つけました:
ppnn13%dkstFeb.1st
中国の決意は、このパスワードは次のとおりです。PingのPingのカール以上13未満、カルダモンShaotou月上旬。csbt34.ydhl12s
中国の決意は、このパスワードは次のとおりです。バイ苔池上3または4つの点、二回オリオールの下- ...
など、あなたはそれが素晴らしいです、プログラマの人文科学の多くは非常に高く、まだあるでしょう。
2.2.2暗号化
我々はまた、一般に、任意のデータからデジタル「フィンガープリント」を作成する方法であるハッシュアルゴリズム、ハッシュ関数として知られ、パスワードの暗号化ハッシュ関数を使用します。メッセージのハッシュ関数は、少量のデータ、固定フォーマットデータダウンし、その後破壊データを混合は、ハッシュ値を再作成するように、ダイジェスト、またはデータ圧縮。ハッシュ値は、通常の文字と表現する数字の短いランダムな文字列です。良いハッシュ関数ハッシュ衝突はめったに入力フィールドに発生しません。ハッシュテーブルとデータ処理では、データを区別するために、競合を阻害しない、データベースのレコードを見つけることがより困難になります。私たちの共通のハッシュ関数は、MD5メッセージアルゴリズム、セキュアハッシュアルゴリズム(セキュアハッシュアルゴリズム)を消化しています。
しかし、唯一のハッシュ関数を使用すると、パスワードのセキュリティを向上させるためには、一般的なもの必要性塩で、パスワードの暗号化プロセスは十分ではありません、塩はプレーンテキストで同じパスワード場合でも、その後、塩を加える、いわゆる乱数またはユーザー名でありユーザーが生成したパスワードが大幅にパスワードのセキュリティを向上させることができ、同じ暗号文、ではありません。(ユニークユーザー名があるため)、それは特別なレコードフィールドsalt値かもしれないが、データベース中の塩の伝統的な方法は、塩の値を記録するために特別なフィールドを必要とし、このフィールドには、ユーザー名フィールドであってもよいし、この構成がより複雑になります。
春のセキュリティは、パスワードの暗号化方式、公式の推奨BCryptPasswordEncoder、強力なハッシュ関数bcryptのBCryptPasswordEncoder利用を数多く提供して、開発者は、強さとSecureRandomのインスタンスを提供するために使用することを選択することができます。強度が大きいほど、キーの反復回数、反復のキー番号が2 ^強度です。デフォルトでは10、4〜31の強度値。
史郎が自分のパスワード塩を処理する必要が異なっている、春のセキュリティでは、BCryptPasswordEncoderは塩が付属しており、それが簡単になっています。
実装クラスはBCryptPasswordEncoder PasswordEncoderインターフェースです。
2.2.3 PasswordEncoder
このインターフェイスのPasswordEncoderは、3つのメソッドを定義しています。
public interface PasswordEncoder {
String encode(CharSequence rawPassword);
boolean matches(CharSequence rawPassword, String encodedPassword);
default boolean upgradeEncoding(String encodedPassword) {
return false;
}
}
- 平文を暗号化するために、パスワードをエンコードするために使用される方法は、暗号文は暗号化された後、返されました。
- この方法は、照合用パスワードがクリアテキストのパスワードとこれにメソッドに渡されたパラメータとして送信されたユーザ・パスワードの暗号文に格納されたデータベースは、ブール値に応じたリターンに入力されたユーザーのパスワードかどうかを決定するユーザーがログインする、方法を、一致しています正しいです。
- かどうかupgradeEncodingは、再暗号化する必要があり、これは一般的に持っていないでしょう。
私たちは、次の図でPasswordEncoder実装クラスを見ることができます:
2.2.4設定
予選終了後、我々は方法を設定の詳細を見てみましょう。
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("javaboy.org")
.password("123").roles("admin");
}
}
- まず、私たちのカスタムSecurityConfigはWebSecurityConfigurerAdapter、書き換えconfigureメソッドの内部から継承されました。
- 今回の場合は比較的単純であるため、まず、私たちは、私が最初に暗号化するためにパスワードを与えていないので、それはNoOpPasswordEncoderのインスタンスを返すことができ、PasswordEncoderの例を提供します。
- 私たちはinMemoryAuthenticationで開きますconfigureメソッドは、メモリのユーザーに定義され、withUserは、ユーザー名、パスワードは、役割がユーザーの役割は、ユーザーのパスワードです。
- 接続されているユーザー、複数の設定します。
なぜ、それに接続されていますか?
それはXMLファイルであるため、春ブーツがない場合には、我々はSSM春のセキュリティ、春のセキュリティは、使用中のすべてのXMLファイルで構成されているこの時間は、ラベルが終了しているようになった、と今でXMLタグの象徴と同等ですターミネータは、現在のラベルの終わりを示し、これはinMemoryAuthentication方法を返却し、新しいユーザ設定を開きますタイムコンテキストがあります。
設定後、再度プロジェクトを開始し、その後、訪問/ハローインターフェースを行く、構成XMLファイルを上書きしますJavaコードの構成は、アクセスの成功への唯一のユーザー名のJavaコード/パスワードを見つけるでしょう。
3.カスタムフォームのログインページ
デフォルトのログインフォームやや醜い(実際には、デフォルトのログインフォームより良い前より醜い、以前よりも)。
しかし、我々はまだ絶対に、ログインページビット醜い多くの時間が、我々は、ログインページをカスタマイズすることができます。
一緒に見てみましょう。
3.1サーバーの定義
そして、我々は、以前SecurityConfigクラスを改善し続けること書き直しを続けるconfigure(WebSecurity web)
とconfigure(HttpSecurity http)
、次のように、メソッドを:
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/js/**", "/css/**","/images/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login.html")
.permitAll()
.and()
.csrf().disable();
}
- ()web.ignoringは無視URLアドレスを設定するために使用され、通常は静的ファイルのために、我々は、使用してこれを行うことができます。
- 私たちは春のセキュリティを構成するためにXMLを使用する場合は、内部のメジャーレーベルがあるだろう
<http>
、設定方法HttpSecurityタグに提供さに相当します。 - authorizeRequestsが対応します
<intercept-url>
。 - formLogin対応
<formlogin>
。 - そして現在のラベルの終了を指示するための方法であって、コンテキストバックHttpSecurity、新しいラウンドの構成を開き。
- ログイン関連のページを表すpermitAll /インタフェースは、傍受されないようにしてください。
- CSRFは特殊と誰もが言っについて最後に、私の質問に戻って、CSRFをオフにすることを忘れないでください。
私たちは、時間/login.htmlのログインページを定義すると、春のセキュリティは自動的に/login.htmlインタフェースを登録するには私たちを助けるだろう、このインターフェースは、ログインロジックを処理するために、POSTリクエストです。
3.2フロントエンドの定義
次のように歌Geが、まずまずのログインページを準備します。
私たちは、資源の春ブーツプロジェクト/静的なディレクトリにコピーされ、関連する静的ログインページを提出します。
フロントページの長い、そしてここで私はリスト(:私はGitHubのにアップロード完全なコードのコアに来るhttps://github.com/lenve/spring-security-samples):
<form action="/login.html" method="post">
<div class="input">
<label for="name">用户名</label>
<input type="text" name="username" id="name">
<span class="spin"></span>
</div>
<div class="input">
<label for="pass">密码</label>
<input type="password" name="password" id="pass">
<span class="spin"></span>
</div>
<div class="button login">
<button type="submit">
<span>登录</span>
<i class="fa fa-check"></i>
</button>
</div>
</form>
フォームフォーム、アクションに注意を払う/login.html
、他の正常な動作ですが、私は繰り返しません。
設定が完了した後さて、この時点で任意のページを訪問し、プロジェクトを再起動して行く、自動的に私たちは、このアップを定義ページにリダイレクトされます、ユーザー名とパスワードを入力して再度ログインすることができます。
4.セクション
この記事と春のセキュリティのエントリーについて、我々は単に話は、フォーム構成は、我々は次の記事に引き続き、多くの詳細があります。