2016-02-16 28 views
0

我還沒有找到一個簡單的一次性配置選項來保護REST URL中的用戶部分,而無需每次使用Spring的@PreAuthorize批註或通過代碼進行查找。爲了讓事情自然地休息,讓我們說有這個網址:Spring安全基於REST的用戶身份驗證沒有Boilerplate代碼

colleagues/private/user1/todolist 

我知道在春天,你可以配置如下:然而

http.authorizeRequests().antMatchers("/colleagues/private/**「) 
.authenticated().anyRequest().permitAll(); 

,一旦通過身份驗證的用戶可以訪問的同事/私人,沒有什麼可以阻止用戶1中:

colleagues/private/user1 

訪問在user2的私人領域:

colleagues/private/user2 

和今後訪問說:

colleagues/private/user2/todolist 

有誰知道一個更好的方法沒有詳細考慮的Spring Security的最新版本的配置選項的優勢呢?例如,有沒有一種方法可以配置類似下面的配置,只需配置一個用戶(或URL的任何子元素)的基於REST的url安全性,只能由他/他或通過配置的任何條件訪問:

http.authorizeRequests().antMatchers("/colleagues/private/{user}/**」) 
.access({user}==principal.username]/**「).anyRequest().permitAll(); 

感謝

+0

將'@ PreAuthorize'添加到需要此檢查的方法中,而不是手動執行。 –

+0

感謝您的回覆,但這正是我想要避免的,也就是說,在每個地方都有@PreAuthorize註釋,而是在一個地方有類似的東西:http.authorizeRequests()。antMatchers(「/ colleagues/private/{user}/**「).access({user} == principal.username]/**」)。anyRequest()。permitAll(); –

+0

你不能這樣做,因爲過濾器不知道過濾器即將被調用 –

回答

0

你可以逃脫一個@PreAuthorize註釋爲每個控制器方法。

@PreAuthorize("#userId == authentication.name") 
@RequestMapping("/colleagues/private/{userId}") 
public User getUser(@P("userId") @PathVariable("userId") String userId) { 
    /* ... */ 
} 

您需要重複的todolist等等,但我仍然認爲這是很簡單的。

您可以將@PreAuthorize放在您的DAO接口上,並可能避免一些重複。

+0

然而,儘管它很簡單,但我不想詳細說明,即所有這些檢查都在各處,而是將它們放在一個地方。 –