【Shiro】SimpleAuthorizationInfoの認可方法

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 クラスの青いボックス

getAuthorizationInfoAuthorizingRealm と AuthenticatingRealm を組み合わせると、AuthorizingRealm の中および大きい赤いフレームがgetAuthenticationInfoAuthenticatingRealm の中および大きい青いフレームに似ていることがわかります。
このコードの目的は、キャッシュがあるかどうかを確認し、キャッシュからユーザーの認証情報または認可情報を見つけることを目的としています。
ここに画像の説明を挿入
内側の小さな赤いボックスと小さな青いボックスを見てみましょう。クリックしてそれぞれを表示します。小さな赤いボックスの戻り値は PrincipalCollection クラスのオブジェクトです。小さな青いボックスの戻り値は [token.getPrincipal]principalsですUsername。 ()]。
ここに画像の説明を挿入
次に、キャッシュを使用するprincipalsかキャッシュに移動して、対応する(認可情報) または(認証情報)Usernameを見つけます。AuthorizationInfoAuthenticationInfo

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、その権限に権限が含まれている場合は渡します。

4. 概要図

ここに画像の説明を挿入

おすすめ

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