2016-06-22 86 views
0

的URL像安全网址给用户

@RequestMapping(value = "https://stackoverflow.com/users/{userId}/update/password", method = RequestMethod.PUT) 

如何确保连接的用户只能修改其密码,而不是其他用户的一个...

其实,我有对URL保护...但它不足以防止这种情况下

http.authorizeRequests().antMatchers("/rest/users/**").hasRole("USER"); 
+0

如果你分享更多的代码,你可能会得到更确切的答案。 – holmis83

+0

没有代码,我在做之前先问一个问题。 –

+0

检查连接用户的ID是否与URL中的用户ID相同。 –

回答

0

我soppuse你有一个/ rest/users/**认证。您可以通过以下代码获取当前用户

YourUserPrincipalDto dto = (YourUserPrincipalDto) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
Long userId = dto.getUserId(); 

YourUserPrincipalDto应该实现的UserDetails

+0

好,所以没有办法在这种命令中检查这种类型:http.authorizeRequests()。antMatchers(“/ rest/users /**").hasRole("USER“); –

1

假设你有一个Spring bean与用户名的公共方法作为一个参数(它可以在控制器,安全层,服务层o [R DAO),您可以添加注释@PreAuthorize

@PreAuthorize("#username == authentication.name") 
public void updateUserPassword(String username, String newPassword); 

如果没有这样做,您必须在您的安全配置使前,后的注释。

+0

我也会这样,但在服务层。它真的不应该在DAO上。 –

+0

无论如何,upvoted至少你是使用AOP模式,而不是在不应该处理它的类中编码安全性。 –

+0

为什么不在控制器上? –

0

Principal对象(如here)添加到您的方法的参数列表,以确认该认证用户相同的用户在API URL的用户ID(做任何背景DAO查询所必需的用户标识和认证的之间的映射用户)。如果不是,则返回403或404,否则更新密码。无论您是返回403还是404,最好保持一致,并为未授权和用户未发现的情况返回相同的号码,以免向黑客提供不需要的信息。

+0

有趣的是,如果我找不到任何与authorizeRequests ...我可以使用这种方式+ authorizeRequests –