2016-06-22 89 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 –