2017-08-31 77 views
1

我在我的Web應用程序中成功實現了JWT作爲認證過濾器。當用戶的login成功時,我將創建一個新的JWT並在字段JWT中指定userName。 在隨後的請求中,我在JWTsub字段中使用userName來標識用戶。但是如果用戶在應用程序的更新部分中更改他的userName會怎麼樣。有沒有辦法,我可以在JWT更新sub字段的值?動態更改JWT主題字段

我在想什麼!

我想湊了RestController現有JWT的和更新後userName,我將與新userName更新JWT,再發回給客戶端。這很好還是有更好的方法?

回答

1

我想我應該在更新完成後刷新令牌並將刷新的令牌發送回客戶端。

@RequestMapping(value = "/account", method = RequestMethod.POST) 
public ResponseEntity<?> updateAccount(@RequestBody UserDetailsBean userDetailsBean, HttpServletRequest request, 
     HttpServletResponse response) 
{ 
    try 
    { 
     UserAccessDetails accessDetails = getLoggedInUser(); 
     UserDetailsBean updatedUserBean = userService.updateAccount(userDetailsBean, accessDetails); 

     // send updated jwt incase of mobile number update by user 
     response.addHeader(SecurityConstants.HEADER_STRING, 
       SecurityConstants.TOKEN_PREFIX + refreshJWT(updatedUserBean.getMobileNumber())); 
     return buildResponse(updatedUserBean); 
    } 
    catch(DataException e) 
    { 
     return buildError(e); 
    } 
} 

private String refreshJWT(String subject) 
{ 
    return Jwts.builder().setSubject((subject)) 
      .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) 
      .signWith(SignatureAlgorithm.HS512, SecurityConstants.SECRET).compact(); 
} 

這是行得通的。如果有人有清潔和行業標準的方法,請註明。

1

如果您允許您的用戶更改他們的用戶名,他們還應該有一個不可變的用戶ID,可用於識別與給定用戶關聯的任何數據或活動。否則,用戶每次更改其名稱時,都將失去審計用戶過去操作的能力,或者必須更新數據庫中該用戶名的所有引用。更糟的是,如果在數據庫中引用了舊用戶名,而另一個用戶使用該用戶名 - 現在由於用戶標識的處理不正確,您現在將一個用戶的數據與另一個用戶相關聯。

現在說,子聲明應該包含這個不可變的用戶ID。您可以爲可變用戶名創建單獨的聲明。當用戶名被改變時,你現在只需要改變數據庫中的一個字段(假設只有users表引用了這個可變用戶名)。然後,您可以使用刷新標記檢索新的標記,該標記將包含最新的用戶名,然後可以根據需要使用您的API。

使用這種方法,你應該小心僅使用用戶名要求爲顯示目的,不用於識別由於它是可變的登錄的用戶。包含用戶標識的子索賠將用於識別用戶。

同樣重要的是要注意,此解決方案要求任何特殊邏輯「更新子要求。」您將使用您已用於爲提供的刷新令牌生成令牌的相同邏輯。

+0

現在,每當用戶更新我創建一個新的'JWT'任何字段,它包含最新的'userName'在其可變'sub'場。 –