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) メソッドの最初の図を参照)、例外がコントローラーでキャッチされてフロントエンドに返されます。