8

本当に柔軟なセキュリティ フレームワーク Apache Shiro を見つけました。Shiro を使用して認証と承認を正常に実装しました。

このフレームワークの魅力的な機能の 1 つは、インスタンス ベースのセキュリティです。Shiro の Web サイトから例をコピーしました。

次のアクセス許可がデータベースに格納されます。

printer:query:lp7200
printer:print:epsoncolor

次のコードは、特定のプリンター インスタンスについて、現在認証されているユーザーにアクセス許可があるかどうかを確認します。

if ( SecurityUtils.getSubject().isPermitted("printer:query:lp7200") {
 // Return the current jobs on printer lp7200
}

私の質問は、「これはアクセス許可がデータベースに保存される方法ですか?」ということです。インスタンス ベースのアクセス許可を保存するより良い方法はありますか?

私にお知らせください。

ありがとう

4

1 に答える 1

11

この情報をどのように保存するかは、完全にあなた次第です。実装Realmは、使用しているデータソースにクエリを実行し、好みの形式で許可データを抽出する責任があります。

それらを文字列として直接保存する人もいれば(例に示すように)、専用のテーブルに保存する人もいます(RDBMSを使用している場合など)(permission_type、target、action列など)。権限エンティティをロールに関連付けることも、ユーザーに直接関連付けることも、ユーザーに割り当てられたグループなどに関連付けることもできますが、アプリケーションにとっては意味があります。

ストレージのオプションは完全にあなた次第です。データを実体化しますが、Realm.isPermitted(...)操作が期待どおりに機能することを確認します。

多くの人は、メソッドを直接実装するよりも、抽象クラスをサブクラス化し、メソッドをオーバーライドして、アクセス許可の表現をサポートするインスタンスを返すRealm.isPermitted(...)方が便利だと感じています。AuthorizingRealmdoGetAuthorizationInfoAuthorizationInfo

その方法では、データストアにクエリを実行し、返されたデータをインスタンスに変換するAuthorizationInfoだけで完了です (承認キャッシュを有効にすることを忘れないでください。パフォーマンスが大幅に向上します)。

メソッドのオーバーライドは、Realm isPermittedクエリなどを非常に具体的に制御したい場合にのみ必要です。

于 2012-01-20T18:44:21.380 に答える