2017-08-31 14 views
1

Webアプリケーションで認証フィルタとしてJWTを正常に実装しました。ユーザーのloginが成功すると、新しいJWTを作成し、subフィールドのuserNameJWTに割り当てています。 その後のリクエストでは、をJWTsubフィールドに使用してユーザーを識別しています。しかし、ユーザーがアプリケーションの更新セクションのuserNameを変更した場合はどうなりますか?方法はありますか?subフィールドの値をJWTに更新できますか?JWTサブジェクトフィールドを動的に変更する

私は何を考えているのですか?

私はRestController内の既存のJWTを得ることを考えていますし、userNameを更新した後、私は新しいuserNameJWTを更新し、再び戻ってクライアントに送信されます。これは問題ないのですか?

答えて

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の誤った取り扱いにより、あるユーザーのデータが別のユーザーのデータに関連付けられるようになりました。

これで、サブクレームにはこの不変のユーザーIDが含まれているはずです。変更可能なユーザー名に対して別々のクレームを作成することができます。ユーザー名が変更されたときは、データベース内の1つのフィールドを変更するだけで済みます(ユーザーテーブルがこの変更可能なユーザー名を参照していることを前提とします)。リフレッシュトークンを使用すると、必要に応じてAPIで使用できる最新のユーザー名を含む新しいトークンを取得できます。

このアプローチを使用すると、ログインユーザーが変更可能であるためにユーザーを識別するのではなく、表示目的でユーザー名クレームのみを使用するように注意する必要があります。ユーザーIDを含むサブクレームは、ユーザーを識別する目的に役立ちます。

この解決策は、「サブクレームを更新する」ための特別なロジックを必要としないことに注意することも重要です。提供されたリフレッシュトークンのトークンを生成するために既に使用しているものと同じロジックを使用しています。

+0

ユーザーがフィールドを更新するたびに、変更可能な 'sub'フィールドに最新の' userName'を含む新しい 'JWT'を作成しています。 –

関連する問題