2016-04-25 4 views
2

私たちは、Spring SecurityのACLアノテーションを使用して、特定のWebサービスにアクセスできるようにしています。 @PreAuthorize@PostAuthorizeは非常に有用であると思われ、私たちが持っているほとんどのユースケースに有利です。個々のメソッド等に関するSPELベースのルールは、アプリケーションとそのサービスにおける細粒度のセキュリティを支援しています。例えばのためにSpring Security @Preとコレクションのコレクションの@Postアノテーションの使い方

: - 単一のオブジェクトが返されたときにこれが正常に動作します

@PreAuthorize("hasRole('ROLE_ADMIN') and returnObject.owner == authentication.name") 
public SomeDTO getSomeDTO(){ ... } 

以下のように私たちは、返されたオブジェクトの所有者を確認してください。リストが返された場合、同等のものは何ですか?コレクションをループして、そのコレクション内の個々の要素のプロパティをSPELを使用してチェックするにはどうすればよいですか?

答えて

0

次の式を試してみてください。

@PreAuthorize("hasRole('ROLE_ADMIN') and returnObject.?[owner == authentication.name].size() == returnObject.size()") 
public List<SomeDTO> getSomeDTOs(){ ... } 

このpostを参照してください。

+0

これは動作していないようですが、ドキュメントは正当なものと思われます。いくつかの例を試してみましょう – aksappy

1

コレクションの場合は、@PreFilter@PostFilterアノテーションを使用する必要があります。返されたコレクションを

@PostFilterアノテーションを使用して、春のセキュリティが繰り返さ と 供給式が偽である任意の要素を削除します。名前filterObjectは、コレクション内の現在のオブジェクト を参照します。 @PreFilterを使用して メソッド呼び出しの前にフィルターをかけることもできますが、これは一般的ではない 要件です。

hereの例を参照してください。

@PreAuthorize("hasRole('ROLE_ADMIN')") 
@PostFilter("filterObject.owner == authentication.name") 
public List<SomeDTO> getAll(); 
0

これは必要に応じて異なります。

の結果から許可されていないオブジェクトを除外する場合は、一致しない要素を除外する@PostFilterアノテーションを使用できます。 例(filterObjectが応答から単一のリスト要素にバインドされている):

@PostFilter("filterObject.owner == authentication.name") 
public List<SomeDTO> getAll(){ ... } 

すべての要素が@PostFilterを許可されている場合にのみ、結果を返すための意図は、あなたと、あなたが試みることができる助けにはなりませんあなたの場合@PostAuthorize注釈内のSPELのhasPermission機能を使用してください。 Permissionは任意のタイプのオブジェクトを取得し、カスタム実装(それを記述する必要があります)を使用して論理的にチェックできますか? 例を参照することができますthis example (section 4)

関連する問題