SpringSecurityユーザー認証用のユーザー名とパスワードを設定する3つの方法

SpringSecurityユーザー認証用のユーザー名とパスワードを設定する3つの方法

まず、いくつかの単語の意味を理解します。

認証:認証

AuthenticationManagerBuilder:Authentication Manager Builder

エンコーダー:コンパイラー

PasswordEncoder:パスワードコンパイラ

SpringSecurityのデフォルトのユーザー認証

まず、Spring Securityのデフォルトのユーザー認証が使用されている場合のユーザー名とパスワードを見てみましょう。

ここに写真の説明を挿入

ここに写真の説明を挿入

1.構成ファイルによるユーザー認証

ここに写真の説明を挿入

以下に示すように、SecurityAutoConfiguration.class自動構成クラスを見てみましょう。

ここに写真の説明を挿入

以下に示すように、SecurityProperties.classクラスを見てみましょう。

ここに写真の説明を挿入

ここに写真の説明を挿入

2.構成クラスによるユーザー認証

まず、構成クラスはWebSecurityConfigurerAdapterアダプタークラスを継承する必要があります。WebSecurityConfigurerAdapterクラスはアダプターです。構成するときは、それを継承する構成クラスを作成してから、独自の特別なニーズの構成を作成する必要があります。

ここに写真の説明を挿入

and()メソッドを使用して複数のユーザー情報を接続するだけで、複数のユーザー情報とそのアクセス許可を同時にメモリに保存することもできます。

 // 自定义配置认证规则
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    
    
        auth.inMemoryAuthentication()
                .withUser("zhangsan").password("12345").roles("SuperAdmin")
                .and()
                .withUser("lisi").password("12345").roles("Admin")
                .and()
                .withUser("wangwu").password("12345").roles("Employee");

    }

ID「null」にマップされたPasswordEcoderはありません异常

異常の原因

以下は、上の図で説明したid "null"例外にマップされたPasswordEcoderがないことに焦点を当て、その解決策について説明しています。

Spring Security 5.0にはさまざまな暗号化方式が追加され、デフォルトのパスワード形式も変更されました。

公式ドキュメントを見てみましょう:

The general format for a password is:
{id}encodedPassword

Such that id is an identifier used to look up which PasswordEncoder should be used and encodedPassword is the original encoded password for the selected PasswordEncoder. The id must be at the beginning of the password, start with { and end with }. If the id cannot be found, the id will be null. For example, the following might be a list of passwords encoded using different id. All of the original passwords are "password".

{bcrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BG 

{noop}password 

{pbkdf2}5d923b44a6d129f3ddf3e3c8d29412723dcbde72445e8ef6bf3b508fbf17fa4ed4d6b99ca763d8dc 

{scrypt}$e0801$8bWJaSu2IKSn9Z9kM+TPXfOc/9bdYSrN1oD9qfVThWEwdRTnO7re7Ei+fUZRJ68k9lTyuTeUp4of4g24hHnazw==$OAOec05+bXxvuu/1qZ6NUR+xQYvYv7BeL1QxwRpY5Pc=  

{sha256}97cde38028ad898ebc02e690819fa220e88c62e0699403e94fff291cfffaf8410849f27605abcbc0

**この一節は、Spring Securityのパスワードの保存形式が「{id}…………」であることを意味します。前のIDは暗号化方式であり、IDはbcrypt、sha256などの後に暗号化できます。つまり、プログラムは渡されたパスワードを取得すると、最初に「{」と「}」に含まれるIDを探して、パスワードが見つからない場合は暗号化の方法を決定します。 IDがnullだと思います。**これが、プログラムがエラーを報告する理由です。ID「null」にマップされたPasswordEncoderがありません。公式ドキュメントの例は、同じパスワードに対してさまざまな暗号化方法が暗号化されているストレージフォームです。元のパスワードは「password」です。

解決

configureでコードを変更する必要があります。フロントエンドから渡されたパスワードを何らかの方法で暗号化する必要があります。SpringSecurityの公式の推奨事項は、bcrypt暗号化を使用することです。

メモリ内のパスワードにアクセスする

そのようなものです:

protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    
    

  //inMemoryAuthentication 从内存中获取

  auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder()).withUser("user1").password(new BCryptPasswordEncoder().encode("123")).roles("USER");

}

inMemoryAuthentication()。passwordEncoder(new BCryptPasswordEncoder()) "。これは、ログイン時にBCrypt暗号化を使用してユーザーパスワードを処理するのと同じです。以前の" .password( "123") "は" .password(new BCryptPasswordEncoder())になります。 .encode( "123")) "は、Bcryptエンコードおよびメモリ内のパスワードの暗号化に相当します。比較したときにパスワードが同じである場合、ログインが許可される前にパスワードが正しいことを意味します。

概要:ユーザーがユーザー認証のためにログインすると、フロントエンドからのパスワードはBCrpt暗号化で暗号化されます。暗号化されたパスワード形式は{id} passwordで、プログラマーは最初に暗号化方法である{id}を取得します。 、passwordEncoder(new BCryptPasswordEncoder())が書き込まれていないとすると、フロントエンドから送信された値はBCrpt暗号化で暗号化されないため、プログラマーはフロントエンドから送信された値を取得するときにパスワード内の{id}を見つけることができません。暗号化されているため、ID「null」例外にマップされたPasswordEcoderは報告されません。passwordEncoder(new BCryptPasswordEncoder())は、フロントエンドからデータを暗号化するために使用される暗号化方法をシステムに通知するものとして理解できます。プログラムでpasswordEncoder(new BCryptPasswordEncoder())を使用すると、bcryptで暗号化されたパスワードと、メモリに格納されているbcryptで暗号化されたパスワードが比較されます。同じ場合、ユーザーが入力したパスワードとメモリ内のパスワードが比較されます。パスワードが同じ場合、ログインが許可されます。

PasswordEncoderインターフェース

ここに写真の説明を挿入

BCryptPasswordEncoderは、PasswordEncoderインターフェイスの実装クラスです。
ここに写真の説明を挿入

パスワードを暗号化するときは、BCryptPasswordEncoderなどの関連する実装クラスのencodeメソッドを呼び出す必要があります。ユーザーがログインすると、matchesメソッドが自動的に呼び出されてパスワードが比較されます。

3.ユーザー詳細実装クラスをカスタム作成してユーザー認証を実行します(データベースにクエリを実行する必要があります)

データベース内のテーブル

次に示すように、最初にデータベースのusersテーブルを確認します。

ここに写真の説明を挿入

データベース内のテーブルに対応するJavaBeanエンティティクラス

ここに写真の説明を挿入

データベースのカスタマイズに基づくユーザー固有の実装クラス

カスタムユーザー固有の実装クラスは次のとおりです。

ここに写真の説明を挿入

UserDetailsS​​erviceインターフェース

ここに写真の説明を挿入

SpringSecurity構成クラス

ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/qq_45950109/article/details/111444476