I.はじめに
この記事は、前回の記事を元に、[Shiro] SimpleAuthenticationInfo がパスワードを検証する方法を紹介します。
2.カスタムShiroRealmクラス
doGetAuthorizationInfo
前回の記事で調べたので、今回はメソッドを直接調べる、AuthorizingRealmを継承するShiroRealmを振り返ってみましょう
3. AuthorizingRealm クラス
AuthorizingRealm では、検索によってメソッドdoGetAuthorizationInfo
を見つけることができます。getAuthorizationInfo(PrincipalCollection principals)
1、プリンシパルコレクション
getAuthorizationInfo(PrincipalCollection principals)
メソッド内で、PrincipalCollection
ここにオブジェクトがありますが、これがどこから来たのかは調べていません(おそらく最下層から渡されたものと思われます)。
しかし、[Shiro] SimpleAuthenticationInfo がパスワードを検証する方法 を書いているときに気づきましたがdoGetAuthenticationInfo
、認証中に新しい SimpleAuthenticationInfo オブジェクトに値が割り当てられ、PrincipalCollection
最後に、関数、クラス、および推測によると、SimpleAuthenticationInfo オブジェクトによって AuthorizingRealm クラスgetAuthorizationInfo(PrincipalCollection principals)
がPrincipalCollection principals
作成されます。
2. AuthorizingRealm クラスの青いボックス
getAuthorizationInfo
AuthorizingRealm と AuthenticatingRealm を組み合わせると、AuthorizingRealm の中および大きい赤いフレームがgetAuthenticationInfo
AuthenticatingRealm の中および大きい青いフレームに似ていることがわかります。
このコードの目的は、キャッシュがあるかどうかを確認し、キャッシュからユーザーの認証情報または認可情報を見つけることを目的としています。
内側の小さな赤いボックスと小さな青いボックスを見てみましょう。クリックしてそれぞれを表示します。小さな赤いボックスの戻り値は PrincipalCollection クラスのオブジェクトです。小さな青いボックスの戻り値は [token.getPrincipal]principals
ですUsername
。 ()]。
次に、キャッシュを使用するprincipals
かキャッシュに移動して、対応する(認可情報) または(認証情報)Username
を見つけます。AuthorizationInfo
AuthenticationInfo
3. doGetAuthorizationInfo(プリンシパル) の情報は誰のためのものですか?
この部分はShiroRealmにおける@Overrideの認可であり、最後に認可情報infoを返します。
ここで疑問があります。この情報は返されますが、誰のためのものでしょうか?
主にShiroのSubjectオブジェクトを使用したプログラムによる認証方法を見てみましょう。
Subject subject = UserUtils.getSubject();
subject.isAuthenticated(); // 是否身份验证授权通过
subject.isPermitted(permission); // 验证权限字符串
subject.isPermittedAll(permissions); // 验证权限字符串全部通过
subject.hasRole(roleIdentifier); // 验证是否有角色权限
ここで呼び出すメソッドがいくつかあります。Subjectsubject.isPermitted(permission);
インターフェイスを見てみましょう。
その実装クラス DelegatingSubject にアクセスして、securityManager.isPermitted(getPrincipals(), permission)
その中のメソッドを確認してください。(SecurityManager が表示されます)
AuthorizingRealm に入ってメソッドを確認するとisPermitted
、最終的にそのメソッドが情報を返すために使用されたことがわかりますgetAuthorizationInfo(principals)
。
順番に、 isPermitted の最後の実行は、perm
データベース内のユーザーの権限とインターフェイスによって定義された権限を取得しpermission
、その権限に権限が含まれている場合は渡します。