我在SpringBoot上有一个部署到Cloud Foundry的应用程序。它有一个绑定服务,它将一些信息附加到VCAP_SERVICES,我可以在application.properties文件中使用它来接收与安全相关的数据。
此服务变量位于整个VCAP_SERVICE环境变量的user-provided
子json中,如下所示:
"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": []
}
]
在我的application.properties中我有
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-scopes
的{{1}} json将被读作字符串,然后我会解析它 - 没问题。问题是,即使我添加到VCAPS
字段SecurityProperties
,它也会与此字符串绑定:String authScopes
。没什么用的。
如果您有任何想法 - 请分享。
答案 0 :(得分:2)
Spring Boot通过CloudFoundryVcapEnvironmentPostProcessor提供vcap.
属性。该类读取VCAP_SERVICES
JSON并将其展平为一组离散属性。如果您向应用程序添加Spring Boot actuators并访问/env
端点,您将看到已创建的vcap.
属性集。
在您的示例中,属性将包含以下值:
"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完全展平。属性名称使用点表示法来反映JSON结构,但层次结构不会保留在属性集中。简而言之,您尝试执行的操作不适用于Boot属性。
另一种方法是将这些值设置为字符串而不是JSON中的哈希值,如"auth-scopes": "group-1:superadmin,group-2:admin"
或"auth-scopes": "group-1=superadmin,group-2=admin"
。然后,您的SecurityProperties
可以获得vcap.services.my-service.credentials.auth-scopes
的值并将字符串解析为Map。