2017-03-03 3 views
1

テーブルに格納されているオーダーのリストをurl/orders/{id}で公開し、URL内のパスidを変更してプリンシパルがオーダーにアクセスするのを制限したい場合Spring SecurityがSpring Data JPAリポジトリのクエリにどのように役立つのでしょうか。春のセキュリティ4ユーチューブの動画をもとにリポジトリクエリのスプリングセキュリティ権限

: -

interface OrderRepository extends Repository<Order, Long> { 

    @Query("select o from Order o where o.id = ?1 and o.from.id = ?{#principal.id} ") 
    Optional<Order> findOrder(long id); 
} 

これがベストプラクティスですか?理想的には、Spring Dataのメソッド名の機能を使用し、このような場合にクエリを書き換えないようにしたいと思います。

答えて

0

春のセキュリティから、@PreAuthorizeまたは@PostAuthorizeを探していると思います。これらは、春のメソッドレベルのセキュリティのアノテーションです。ロールやその他の属性に基づいて制限することができます。

interface OrderRepository extends Repository<Order, Long> { 

@PreAuthorize("hasRole('ROLE_ADMIN')") // Allows only users with admin privileges 
@Query("select o from Order o where o.id = ?1 and o.from.id = ?{#principal.id} ") 
Optional<Order> findOrder(long id); 

}

https://spring.io/blog/2013/07/04/spring-security-java-config-preview-method-security/


編集:

あなたが現在認証されたユーザーは、オーダーから誰であるかに関連付けられている場合にのみご注文を返すように探している場合。

@PostAuthorize("returnObject.from == authentication.name") 
Optional<Order> findOrder(long id); 

@PreAuthorize @PostAuthorizeアノテーションでsprings式言語を使用できます。

http://docs.spring.io/spring-security/site/docs/current/reference/html/el-access.html

希望これは編集2


に役立ちます:あなたは、コレクションをフィルタリングする@PreFilterと@PostFilterを使用することができます。

@PostFilter("filterObject.from == authentication.name") 
List<Order> findOrder(long id); 

これは、リストを介して実行してからのみ、現在認証されたユーザである受注を返します。また、式を結合することもできます。

@PostFilter("hasRole('ROLE_ADMIN') or filterObject.from == authentication.name") 
List<Order> findOrder(long id); 

これは、現在の認証されたユーザーがROLE_ADMINのロールを持っているかどうかを確認します。ユーザーがその特権を持っていれば、変更されていないリストが返されます。それ以外の場合はフィルターが適用され、「from」が現在の認証済みユーザーに関連付けられているオーダーのみが返されます。

+0

どのように@PreAuthorizeはユーザー単位で許可を行い、役割単位ではできませんか? – aprofromindia

+0

@aprofromindiaが私の投稿を編集しました。 PostAuthorizeは、返されたOrderオブジェクトのfrom変数を現在の認証済みユーザーでチェックします。 – jmw5598

+0

findAll()の認証にこのロジックを実装するにはどうすればいいですか。 @PostFilter()を使用してリスト全体をフィルタリングしたくない。 – aprofromindia