0

我正在使用JWT和spring security來處理REST API端點的授權。在以下示例中,端點提供有關用戶的信息。假設我只想讓ADMIN的用戶能夠獲取所有用戶的詳細信息,其他任何用戶都只能獲取他/她的帳戶詳細信息。任何人都可以考慮採用更具說明性的方式來使用註釋或AOP來實現與以下代碼等效的內容。來自請求參數的JWT Spring安全用戶授權

@RequestMapping(value = "user/{userId}", method = RequestMethod.GET) 
@PreAuthorize("hasAnyRole('USER', 'ADMIN')") 
public UserDetailsDto getUserDetails(
     @AuthenticationPrincipal JwtUser user, 
     @PathVariable String userId) { 
    if (!user.getId().equals(userId) && user.getRole != Role.ADMIN) 
     throw new BadCredentialsException("Jwt token id and requested ids do not match"); 
    //handle the request 
} 
+0

我不是Spring用戶,只是因爲'spring-aop'標籤才發現這個問題。所以原諒我可能愚蠢的問題,但如果你知道你只想讓管理員進入這個方法,爲什麼不改變預授權映射到'@PreAuthorize(「hasAnyRole('ADMIN')」)'?如果我理解正確,目前您允許任何用戶,然後在代碼中手動排除非管理員。如果我誤解了,我仍然可以建議AOP解決方案(我的專業知識),但首先我想澄清這一點。 – kriegaex

+0

我排除了用戶,但請求未映射到其用戶帳戶的用戶,以便只有管理員用戶可以獲取其他所有數據,而普通用戶只能獲取他們自己的數據。我只想重複使用相同的方法,並在外部進行配置。 –

+0

現在我更好地理解你的意圖,謝謝。在我提交AOP答案之前還有一件事情:請您提供一個[MCVE](http://stackoverflow.com/help/mcve),其中顯示您提供用戶標識的所有方式?在你的代碼片段中,當前用戶方法參數#1,獲取詳細信息的id是#2。您還提到了一個'@ RequestBody'註釋,但沒有顯示如何完成。 (我不是Spring的用戶,爲了理解它,我需要查看它。)與此同時,我只能提供一個解決方案,用於這個具體的例子。 – kriegaex

回答

0

您可以將此方法上運行的Aspect定義爲切入點引用。

  1. 在您的項目中包含aop。 (包括apring的AOP相關的罐子,在春季啓動包括彈簧引導啓動的AOP)
  2. 在應用程序配置啓用AOP(註釋與@EnableAspectJAutoProxy註解配置類)
  3. 定義您的看點和配置之前在那裏執行你的邏輯的建議。 例如:現在

    @Aspect 
    @Component 
    public class Test { 
    
        @Before("execution(* com.package.name.*.getUser(..)) && args(user,dto)") 
        public void getAllAdvice(JwtUser user, GetUserRequestDto dto){ 
         System.out.println("Service method getter called"); 
         if (!user.getId().equals(dto.getUserId())) 
          throw new BadCredentialsException("Jwt token id and requested ids do not match"); 
         //handle the request 
        } 
    } 
    

,你的決定應該是方面的一部分,你的業務邏輯進入控制器。

希望這有助於!