2016-02-16 25 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

然而,尽管它很简单,但我不想详细说明,即所有这些检查都在各处,而是将它们放在一个地方。 –