Spring Security ACLは非常に強力に見え、データベースの実装に固執できる場合は簡単に実装できます。ただし、独自のAcl
とAclService
を実装する必要がある場合は、はるかに複雑になるようです(たとえば、この(古い) 非常に基本的なチュートリアル 約26を参照)ページ)そしてそれの参照と例を見つけるのは難しいようです(そのチュートリアルは2008年のものでした)。
たとえば、このアプリケーションでは、ユーザーには役割があり、部門に属しています。ほとんどの場合、役割に基づいて、部門に属するオブジェクトに対していくつかの操作を実行できます。すべての場合において、部門+ロールは、ユーザーに特定のオブジェクトに対する特定の操作を許可するかどうかを決定するのに十分です。
ユーザー、役割、および部門は、ユーザーが接続したときにそれらを取得する外部アプリケーションによって管理されます(RESTサービスを使用していますが、LDAPサーバーの場合もあります)。
ドメインオブジェクトのセキュリティを実装するには、@PreAuthorize('hasPermission(…)')
に依存したいと思います。したがって、2つの解決策が見えてきます。
PermissionEvaluator
を実装します。またはAclService
を使用してACLを実装します。AclService
全体を実装することは、PermissionEvaluator
を実装するよりも難しく、複雑になるようですが、ACLはより標準的であるようです。
どの基準に基づいて、どちらを実装する必要がありますか?
PermissionEvaluator
は、ユーザーが特定のドメインオブジェクトに対するアクセス許可を持っているかどうかを判断するための式の評価を担当します。一方、AclService
は、Acl
インスタンスを取得するためのインターフェースを提供します。 関心の分離 の精神で、各コンポーネントは個別の関心に対処します。
PermissionEvaluator
実装がAcl
インスタンスに基づいて評価を実行する必要がある場合は、それらを取得するためにAclService
に委任する必要があります。実際、AclPermissionEvaluator
はまさにそれを行います。
私はあなたがこのように行くことをお勧めします。 ACLの取得とは別に評価します。 Spring AclService
およびAcl
の概念がユースケースに対して複雑すぎるか複雑すぎる場合は、独自のサービスを導入してカスタムACLを取得できます。次に、ACLサービスに委任するPermissionEvaluator
を実装します。
実際、ACLをNoSQLデータベースに格納する必要があり、Springが提供するものが機能しなかったため、同様のことを行う必要がありました。
要件を満たすようにSpringACLを調整するために必要な作業と、カスタムソリューションを実装するための作業がすべてだと思います。デフォルトのSpringACL実装で要件を満たすことができる場合は、それを選択してください。カスタムソリューションを実装する時間を確実に節約できます。ただし、Spring ACLを要件に適合させることができない場合、または難しすぎる場合は、カスタムソリューションを実装する方が簡単な場合があります。