8

ユーザー管理/パーミッションに関して多くの要件があるシステムを設計しているので、Spring Security ACL を使用してドメイン オブジェクト レベルでパーミッションを管理することにしました。

ただし、ユーザーとエンティティ間の関係を維持するために ACL を使用すると、UI にデータを表示するために ACL に依存する必要があります。

Spring Security によって提供される PostFilter ソリューションは、ユーザーが表示できない/表示できないオブジェクトをフィルタリングするのに優れていますが、数百/数千のエントリを持つエンティティを扱う場合、パフォーマンスに大きな問題があります。データベースからすべてをロードし、ユーザーが「見る」ことを許可されていないオブジェクトを破棄します。

この問題についてはこちら ( SEC-2409 ) で説明していますが、この機能が利用可能になるまでには時間がかかります。そのため、Spring Security ACL を使用するがパフォーマンスの問題を回避するための回避策を見つけようとしています。

ユーザーが (認証プロセス後に) アクセスできるオブジェクトを取得し、その情報をすべてのリクエストで使用できるようにするコードを実装して、開発者が PostFilter に依存せずにその情報を使用してクエリを実行できるようにすることを考えました。 .

それを実装するために、特定のプリンシパル/許可された権限のアクセス許可のリストを取得する方法を見つけようとしていますが、利用可能な AclService 実装でそれを行う方法を見つけることができません。

aclService.getObjectIdentityList(<sid>,<acl_class>)

注:メソッドは継承構造を使用し、親エントリから継承されたすべての ObjectIdentities を含める必要があります。

この問題を解決するためのデータまたは別のアプローチを取得するための提案はありますか?


アップデート

ユーザーがアクセスできるオブジェクトのリストを取得する方法を既に見つけました。

List<ObjectIdentity> childObjects = aclService.findChildren(objectIdentity);
Map<ObjectIdentity, Acl> result = aclService.readAclsById(childObjects, sids);

ACL によってアクセスが制御されるエンティティがいくつかあるだけなので、このアプローチはうまくいきます。そのため、ユーザーがアクセスできる ObjectsIdentities のリストを作成できます。

ただし、返されるマップは、渡される ObjectIdentities のすべての ACL を返すため、返される各 ObjectIdentity にユーザーがアクセスできるかどうかを確認する必要があります。

これを行う簡単な方法、またはこのロジックをすべて単純化する方法はありますか?

4

2 に答える 2

2

より大きなデータ セットを処理するための現在のアプローチは、現在ログインしているユーザーをクエリに含めるようにクエリを更新することです。たとえば、Spring Security と Spring Data の統合を使用して、現在のユーザーを参照するようにクエリを更新できます。

@Query("select d from MyDomain d where d.owner = #{principal.name}")

アクセス許可を手動で管理する必要があるため、明らかにこれは理想的ではありません。SEC-2409を解決すると、Spring は多くの面倒な作業を自動的に行うことができます。

于 2015-06-17T14:57:42.593 に答える