【Shiro】SimpleAuthenticationInfoはどのようにしてパスワードを認証するのでしょうか?

I.はじめに

この記事全体の鍵は、ShiroRealm クラスによって書き換えられた doGetAuthenticationInfo メソッドが誰のメソッドであるかを知ることです。
ここに画像の説明を挿入
上図から、最終的にShiroRealmがAuthenticatingRealmのメソッドを継承していることが分かります。

2.カスタムShiroRealmクラス

ps:写真の①の注意事項は、最下層を見ていない場合の先入観です。
ここに画像の説明を挿入

カスタムShiroRealmでは、検証は①のように見えますが、作成されるのは1つだけでSimpleAuthenticationInfo对象、最終的には②が出てきて消えてしまいます。
初心者として、実行する実際のコードを見つけるためにデバッグを試みましたが、SimpleAuthenticationInfo クラスにジャンプしただけで、最終的には何も見つかりませんでした。

AuthorizingRealmを継承してAuthorizingRealmに入ったShiroRealmを見てみると、
ここに画像の説明を挿入
まだ何もないですが、AuthenticatingRealmを継承していることがわかります(両者の関係は前文の通りです)。

3. AuthenticatingRealm クラス

このクラスでは、 Find によって AuthenticatingRealm クラスに抽象メソッドが含まれていることがわかりますdoGetAuthenticationInfo。つまり、ShiroRealm の @Override がそれです。
ここに画像の説明を挿入
このメソッドを誰が呼び出したかを確認すると、最後に AuthenticatingRealm クラスで、メソッド内の②がこのメソッドを呼び出していることがわかりますgetAuthenticationInfo()。つまり、ShiroRealm で返された内容がここにあります。
ここに画像の説明を挿入

そういえば、①と③をそれぞれ見てみましょう。

1. getCachedAuthenticationInfo(token) メソッド

① 文字通りの意味、最終オブジェクトのパラメータとクラス名から、これはトークン内のユーザー名とパスワードを取得するためであることがわかります。

  • 補足: 鋭い目を持つ友人なら、上の図では①と②の両方が返されることがわかりますinfo(AuthenticationInfo クラス)。コード ロジックは次のとおりです。
// 通过缓存和token获取用户信息
info = getCachedAuthenticationInfo(token);
// 用户信息不存在
if(info == null{
    
    
	// 在ShiroRealm中@Override,获取登录用户的信息
	info = doGetAuthenticationInfo(token);
	...
}

AuthenticationInfo クラス (次の図に示すように) は AuthenticationToken に似ており、これを展開すると、hiro AuthenticationToken システムが表示されます。
ここに画像の説明を挿入

getCachedAuthenticationInfo は主にキャッシュとトークンを調べてユーザー情報を取得します。
ここに画像の説明を挿入

2、assertCredentialsMatch(token, info)方法

ここに画像の説明を挿入
このメソッドではCredentialsMatcher()、何か分かりませんが、以下の if でオブジェクトのメソッドが呼び出されますcm.doCredentialsMatch(token, info)
ここに画像の説明を挿入
インターフェースからは、実装クラスが 4 つあることがわかりますが、それほどナンセンスではありません。それらを 1 つずつ読んだところ、最初のクラスは true のみを返し、2 番目はソルトを使用したクラスを処理し、4 番目はソルトを使用しないクラスを処理することがわかりました。 3枚目戻りすぎて久しぶりにじっくり見てませんでした。

対照的に、私たちが求めているのは塩であるはずです。
ここに画像の説明を挿入

ps: Xiaobai の暗号化はちょっと難しいので今回は割愛しますが、興味のある方は覗いてみてください。

ここでわかるように、doCredentialsMatchこのメソッドでは、トークンによって復号化されたデータがデータベース内のデータと同じであることがわかり、true が返されます。これは検証に合格したことを意味します。

false が返された場合、それがスローされIncorrectCredentialsException(assertCredentialsMatch(token, info) メソッドの最初の図を参照)、例外がコントローラーでキャッチされてフロントエンドに返されます。
ここに画像の説明を挿入

4. 概要図

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_42516475/article/details/130587699