2016-10-10 39 views
3

該問題可以通過下面的例子來定義:如何保護關聯資源?

我有一個類MainClass它與由@OneToOne關係稱爲AssociatedClass另一個類相關。兩者都有一個公開的存儲庫,所以我可以在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); 
} 

所以它永遠不會授權GET方法AssociatedClass類型的對象。但是,由於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

一種選擇是在URL級別保護Spring Data REST端點。例如:

 @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(); 
      } 
     } 

公共訪問:

  • /實體
  • /實體/ ENTITYID

管理員訪問權限:

  • /實體/ ENTITYID /關聯實體
+0

這將適用於大多數情況。不幸的是,在我的情況下,我需要根據記錄的用戶是否擁有它來保護資源。 – bergacat1

+0

例如,在我的用戶類中,我用'@PreAuthorize(「principal.id == #id」)''findOne'方法進行了註釋。我還有另一個類(「CreatedEntity」),它與每個對象的所有者/創建者的用戶有關。所以問題將出現在URL'/ createdEntities/id/createdBy'上。 – bergacat1