3

Shiro はキャッシュ機能を提供しますが、私の場合、ユーザーに対して動的な役割と権限を使用しています。アクセス許可の変更がすぐにユーザーに影響するように、特定のユーザーのキャッシュを期限切れにする必要があります。

レルムにはメソッドがありますが、関連するレルムのインスタンスを取得してメソッドを呼び出してキャッシュをクリアする方法を教えてください。

4

2 に答える 2

6

AuthorizingRealm の拡張 Realm でプライベート メソッド「clearCachedAuthorizationInfo」を公開することになりました。次に、プリンシパルを渡すだけです。

public class MyRealm extends AuthorizingRealm {
    //...
    @Override
    public void clearCachedAuthorizationInfo(PrincipalCollection principals)
    {
        super.clearCachedAuthorizationInfo(principals);
    }
    //...
}

認証キャッシュをクリアするには:

realm.clearCachedAuthorizationInfo( SecurityUtils.getSubject().getPrincipals() );

nullこのメソッドにはキャッシュに対する追加のチェックがあり、存在する場合はキャッシュへの参照を確実に取得できるため、これは少しクリーン/安全だと思います。単に呼び出すだけでgetAuthorizationCache()はこれは行われず、常に機能する場合と機能しない場合があります。

レルムへの参照を維持する必要があります。これを行うには、Spring を介して Shiro を初期化し、必要な場所にシングルトン Bean として注入しました。

于 2014-04-09T02:39:43.943 に答える
1

AuthorizingRealm のメソッド getAuthorizationInfo のソースを確認すると、キー/値ストアを使用して認証情報をキャッシュしているだけであることがわかります。

PrincipalCollection オブジェクトをキーとして使用します。

したがって、次のようなものを呼び出す場合:

realm.getAuthorizationCache().remove(SecurityUtils.getSubject().getPrincipals())

通常、キャッシュはクリアする必要があります。

于 2014-04-05T20:29:32.837 に答える