4

JPAアプリには、アプリがするシナリオがあります

指定されたユーザーが引き出しを許可されているすべてのアカウントを一覧表示する

Account エンティティと、各ユーザーが各アカウントに対して持っている承認を一覧表示する多対多のテーブルがあります。上記のシナリオを実装するために、アプリは現在、2 つのテーブルを内部結合するだけです。これは非常に迅速です。

ここで、明示的な承認レイヤー (apache shiro / spring security / other に基づく) を追加して、承認関連のロジックを残りのコードから隔離することを計画していましたが、...

データベースには約 10,000 のアカウントがあり、「平均的な」ユーザーは、そのすべてで「入金」、半分で「表示」、少数で「出金」が許可されています。

このシナリオを効率的に実装できるセキュリティ フレームワークはありますか?

つまり、それらのいずれかが「select a from Account a」(または同等の SQL) タイプの JPA クエリを「装飾」して、データベースからすべてのユーザー許可をロードせずにアカウントのリストを取得できます。 、すべてのアカウントを取得する必要はありませんか?)

4

3 に答える 3

3

ApacheShiroをご覧ください

これにより、ユーザー認証を1回取得し、セッション中にキャッシュすることができます。さらに、すべてのユーザーがすべてのアカウントを表示できる場合は、これを明示的に定義する必要がないため、オーバーヘッドが大幅に削減されます。

ソリューションにリアルタイムアクセスハンドラーが必要な場合、Shiroには実行時にアクセス許可を動的にリセットする方法もあります。

Shiroを使用すると、一般的なRBACを実装し、次のようにアクセス許可を定義できます。

domain:action:instance

したがって、あなたの場合、パーミッションはユーザーにとって次のようになります。

account:deposit:*  // deposit all accounts
account:view:1111
account:view:2222
account:view:3333 // view on these accounts
account:withdraw:5555
account:withdraw:6666  // withdraw on these accounts

コードでは、次のようなことができます。

if (SecurityUtils.getSubject().isPermitted("account:withdraw:"+account.getAccountNumber() ) {
  // handle withdraw
}

Shiroには、追加の抽象化のためのアノテーション駆動型の権限もあります。

編集

Shiroのアクセス許可は最終結果であり、開始する場所ではありません。ユーザーからロール、ロールからパーミッションのマッピングを、インスタンスへの他のマッピングとともに表す一連のテーブルを使用しました。AuthNの後、通常は、アクセス許可をレンダリングするために必要なデータ構造を構築するために、ユーザーPKによってインデックス付けされた単純なクエリのセットです。

于 2012-09-18T15:25:34.123 に答える
0

EclipseLinkを使用している場合、これにはいくつかの機能があります。

1つは@AdditionalCriteriaアノテーションで、クラスのすべてのクエリにフィルターを適用できるようにします。

http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_additionalcriteria.htm#additionalcriteria

もう1つは、EclipseLinkによるOracle VPD(データベースの行レベルのセキュリティ)のサポートです。

http://wiki.eclipse.org/EclipseLink/Examples/JPA/Auditing

最後に、EclipseLinkはSessionEventsをサポートしており、クエリの実行にフィルターを追加できます。

http://www.eclipse.org/eclipselink/api/2.4/org/eclipse/persistence/sessions/SessionEventAdapter.html#preExecuteQuery%28org.eclipse.persistence.sessions.SessionEvent%29

于 2012-09-19T15:18:17.190 に答える
0

これが、Spring-Security で要件を実装する可能性の 1 つになることを願っています。

  1. 、、 のorg.springframework.security.acls.Permissionよう にカスタムを記述します。ViewAccountDepositToAccountWithDrawFromAccount

  2. カスタム org.springframework.security.access.PermissionEvaluatorオーバーライド hasPermission(Authentication userAuthentication,Object accountObject,Object oneOfThePermission)を記述して、ユーザーが accountObject に対して定義された権限を持っているかどうかを確認します

  3. カスタム エバリュエーターで JPA EntityManager への参照を取得し、DB で user_id、permission_id、account_id を使用してクロス チェック/検証します。

  4. hasPermissionユーザーが「root」の場合、DB で確認せずにすぐに true を返すことができます。

  5. サービス呼び出しに注釈を付ける @PreAuthorize("isAuthenticated() and hasPermission(#accountArgument, 'respectivePermission')")

&のカスタム実装についてはリンクを参照してくださいPermissionPermissionEvaluator

于 2012-05-28T16:03:01.137 に答える