2017-10-25 5 views
2

Cloud FoundryにデプロイされるSpringBoot上のアプリケーションがあります。これには、セキュリティ関連のデータを受け取るために私のapplication.propertiesファイルで使用できるVCAP_SERVICESにいくつかの情報を添付するバインドされたサービスがあります。@ConfigurationPropertiesを使用してCF環境をネストしたJSONを読む

このサービス変数は、全体VCAP_SERVICE環境変数のuser-providedサブJSONであり、次のようになります。私のapplication.propertiesで

"user-provided": [ 
    { 
    "credentials": { 
    "auth-scopes": { 
     "group-1": "superadmin", 
     "group-2": "admin" 
    }, 
    "base64ClientCredential": "SSBBTSBOT1QgVEhBVCBTSUxMWSA6LUQ=", 
    "client-id": "my-app", 
    "client-secret": "g1234567890", 
    "token-info-uri": "https://XYZ.predix.io/check_token", 
    "user-info-uri": "https://XYZ.predix.io/userinfo" 
    }, 
    "label": "user-provided", 
    "name": "my-app-creds", 
    "syslog_drain_url": "", 
    "tags": [], 
    "volume_mounts": [] 
    } 
    ] 

は私が

security.properties.client-id=${vcap.services.my-app-creds.credentials.client-id} 
security.properties.client-secret=${vcap.services.my-app-creds.credentials.client-secret} 
security.properties.token-info-uri=${vcap.services.my-app-creds.credentials.token-info-uri} 
security.properties.user-info-uri=${vcap.services.my-app-creds.credentials.user-info-uri} 
security.properties.auth-scopes=${vcap.services.my-app-creds.credentials.auth-scopes} 

を持っている私も、作成したクラスSecurityPropertiesこれらのプロパティを読み込んでJAVAに格納する:

@Component 
@PropertySource("classpath:application.properties") 
@ConfigurationProperties(prefix = "security.properties") 
public class SecurityProperties { 

    String clientId; 
    String clientSecret; 
    String tokenInfoUri; 
    String userInfoUri; 

    //Required getters and setters 
} 

そして、このクラスは、application.propertiesから受け取った情報にこれらのフィールドを正常にバインドします。

私が地図を受信したいときに問題が発生します。

"auth-scopes": { 
    "group-1": "superadmin", 
    "group-2": "admin" 
} 

私はSecurityPropertiesクラスフィールドに追加してみました:

HashMap<String, String> authScopes; 

しかし、それは私も内部クラス

で試してみました

を失敗しました

AuthScopes authScopes; 

public static class AuthScopes { 
    //various different implementations 
    //to read this but no success at all 
} 

私は他のアイディアを使い果たしました。私はちょうどこれを得る方法を理解することができません。私もauth-scopesjsonからVCAPSの文字列として読み込まれ、それから私はそれを解析します - 問題は受け入れます。問題は、SecurityPropertiesフィールドにString authScopesを追加しても、正確にはこの文字列にバインドされているということです:"${vcap.services.my-app-creds.credentials.auth-scopes}"。役に立った

ご意見がありましたら、どうぞ。

答えて

2

スプリングブートは、CloudFoundryVcapEnvironmentPostProcessorvcap.プロパティを提供します。そのクラスはVCAP_SERVICES JSONを読み取り、離散的なプロパティのセットにフラット化します。 Spring Boot actuatorsをアプリケーションに追加し、/envエンドポイントにアクセスすると、作成されるvcap.プロパティのセットが表示されます。

あなたの例では、プロパティは、これらの値が含まれます:JSONは完全に平坦化しますので

"vcap": { ... "vcap.services.my-app-creds.credentials.auth-scopes.group-1": "******", "vcap.services.my-app-creds.credentials.auth-scopes.group-2": "******", }

は、そのリストにはvcap.services.my-service.credentials.auth-scopesプロパティは、ありません。プロパティ名はドット表記法を使用してJSON構造体を反映しますが、階層はプロパティーセット内に保持されません。要するに、あなたがしようとしていることは、Bootプロパティでは動作しません。

代わりに、"auth-scopes": "group-1:superadmin,group-2:admin"または"auth-scopes": "group-1=superadmin,group-2=admin"のように、これらの値をJSONのハッシュではなく文字列として設定することもできます。 SecurityPropertiesvcap.services.my-service.credentials.auth-scopesの値を取得し、その文字列を解析してマップにすることができます。

+0

この回答ありがとうございます。これは私が恐れていたものです。私は、vcapを逆にして権威を与えられたグループのリスト(私がすでにチェックし、それが働いていた)であるプロパティを作成すると思います。 – Zychoo

関連する問題