2017-07-21 11 views
2

私はSpring JWT認証アプリケーションを作成しました。 JWTにはいくつかのカスタムクレームが含まれています。リソースサーバー側では、これらの主張を収集して確認するためにJWTトークンをどこで解析する必要がありますか?コントローラーやフィルターでこれを行う必要がありますか?ベストプラクティスは何ですか?多分あなたはいくつかの例がありますか?Spring Framework - JWTのカスタムクレームの解析場所

+0

を、あなたは、これらのカスタムクレームの目的について詳しく説明することはできますか?デフォルトでは、Spring Securityは権限や権限を設定し、メソッドとエンドポイントを@PreAuthorizeアノテーションで保護する権限を求めます。 –

+1

JWTトークンのカスタムクレームは、あなたのアプリケーションに知られていなければなりません。理想的には、認証値を抽出してSpringセキュリティコンテキストで設定するのは、フィルタの一部である必要があります。どこから、Auth Managerがチェックすることになります。その後、@ punkrocker27kaが示唆したように、すべてのことをSpringセキュリティ自身で気にすることができます。私の実装を見てみましょう:https://github.com/deepak-java/jwt-spring-boot –

+0

@ punkrocker27kaいくつかのビジネスロジックをカバーするカスタムクレームが必要ですが、デフォルトのクレームでは不十分です。 Deepak Singhが実装に感謝し、それが私を助けます! – dplesa

答えて

3

Jackson Object MapperとSpring Securityクラスの組み合わせ、つまりJwt、JwtHelper、およびAuthenticationを使用できます。 Spring Securityの静的コンテキストオブジェクトを使用して認証を取得し、JwtHelperを使用して受け取ったトークンを解析することができます。

ObjectMapper objectMapper = new ObjectMapper(); 
Authentication authentication = 
SecurityContextHolder.getContext().getAuthentication(); 
Map<String, Object> map = 
objectMapper.convertValue(authentication.getDetails(), Map.class); 

// create a token object to represent the token that is in use. 
Jwt jwt = JwtHelper.decode((String) map.get("tokenValue")); 

// jwt.getClaims() will return a JSON object of all the claims in your token 
// Convert claims JSON object into a Map so we can get the value of a field 
Map<String, Object> claims = objectMapper.readValue(jwt.getClaims(), Map.class); 
String customField = (String) claims.get("you_custom_field_name"); 

上記のコードの3行目にデバッグしてブレークポイントを設定することをお勧めします。その時点で、認証オブジェクトを公開します。私はあなたが後で必要とするいくつかの有用な詳細を持っているかもしれません。

これはコントローラですべて実行できます。私はそうするためにフィルタを使用する方法がわかりません。

+0

これは醜いと感じますが、動作します(@Chillzに感謝します)。 'PrincipalExtractor'クラスがあります。このクラスは、使用できるはずのもの(カスタムインスタンスをBeanとして公開する)のように見えますが、これまでには動作できませんでした。 – demaniak

+0

@demaniakようこそ。 – Chillz

1

あなたもspringframework.boot.json.JsonParserを使用することができます。

JsonParser parser = JsonParserFactory.getJsonParser(); 
Map<String, ?> tokenData = parser.parseMap(JwtHelper.decode(token).getClaims()); 

> tokenData.get("VALID_KEY"); 
0

私はこの使用しています:

private Claim getClaim(String claimKey) { 
    Authentication token = SecurityContextHolder.getContext().getAuthentication(); 
    try { 
     DecodedJWT jwt = JWT.decode(token.getCredentials().toString()); 
     return jwt.getClaim(claimKey); 
    } catch (JWTVerificationException ex) { 
     ex.printStackTrace(); 
     return null; 
    } 
} 
関連する問題