2016-10-10 2 views
3

問題は、次の例により定義することができる。関連リソースを保護する方法は?

Iは@OneToOne関係によってAssociatedClassと呼ばれる別のクラスに関連するクラスMainClassを有します。両方とも公開リポジトリを持っているので、URL /mainClasses/{some_id}とURL /associatedClasses/{some_id}でGETを実行できます。しかし、AssociatedClassRepositoryは、次のコードを持っています

@RepositoryRestResource 
public interface AssociatedClassRepository extends PagingAndSortingRepository<AssociatedClass, String> { 
    @Override 
    @PreAuthorize("1 == 2") 
    AssociatedClass findOne(String s); 
} 

だから、タイプAssociatedClassのオブジェクトにGETメソッドを認可することはありません。しかし、タイプMainClassのオブジェクトにはAssociatedClassオブジェクトが関連付けられているため、/mainClasses/{some_id}/associatedClassでGETを実行してこのオブジェクトを取得できます。

/mainClasses/{some_id}/associatedClassへのアクセスをブロックしたいと思いますが、すべてのユーザーにアクセスすることはできません。私は@PreConditionを介してそれを行うことができます同じ方法でいくつかの条件を定義したいと思います。そのため、認証されたユーザーがリソースの所有者である場合にのみアクセスを許可できます。これが実際の目標です。

アイデア?

+0

コントローラコードを投稿できますか?とリポジトリコード? –

+0

私はSpring Data Restを使用しているため、コントローラがありません。あなたがAssociatedClassRepositoryの完全なコードを見ることができるように私は投稿を編集しました。 – bergacat1

+0

これはセキュリティが全く活性化されていないように見えます。 Spring Data RESTは基本的にメソッドを呼び出すだけです。それがセキュリティ例外を引き起こさない場合は、Spring Securityの設定が正しくないようです。メソッドセキュリティを有効にしてもよろしいですか? –

答えて

1

1つのオプションは、Spring Data RESTエンドポイントをURLレベルで保護することです。たとえば、次のように

 @Override 
     public void configure(HttpSecurity http) throws Exception { 
      http.authorizeRequests() 
      .antMatchers("/entity/{[0-9]+}/{[A-Za-z][A-Za-z0-9]+}").hasRole("ADMIN"). 
      and().csrf().disable(); 
      } 
     } 

公共アクセス:

  • /エンティティ
  • /エンティティ/実体識別子

管理者のアクセス:

  • /エンティティ/実体識別子/関連するエンティティ
+0

これはほとんどの場合に有効です。残念なことに、私の場合は、ログに記録されたユーザーが所有者であるかどうかに基づいてリソースを保護する必要があります。 – bergacat1

+0

例えば、私のユーザクラスでは、 '@PreAuthorize(" principal.id == #id ")'の 'findOne'メソッドを使ってアノテーションを付けました。私は別のクラス( "CreatedEntity")を持っています。これは、各オブジェクトの所有者/作成者であるユーザーに関連しています。したがって、問題はURL '/ createdEntities/id/createdBy'にあります。 – bergacat1

0

は、関連するエンティティのリポジトリに抜粋投影を適用し、

Spring Data Rest: Security based projection

で説明したようにそこにセキュリティチェックを追加関連するリソースが返されますが、あなたは、特定のフィールドまたはそれらのすべてを非表示にすることができます。

関連する問題