Java源码示例:org.springframework.vault.support.VaultResponseSupport
示例1
@Override
@Nullable
public <T> VaultResponseSupport<T> read(String path, Class<T> responseType) {
ParameterizedTypeReference<VaultResponseSupport<T>> ref = VaultResponses.getTypeReference(responseType);
return doWithSession(restOperations -> {
try {
ResponseEntity<VaultResponseSupport<T>> exchange = restOperations.exchange(path, HttpMethod.GET, null,
ref);
return exchange.getBody();
}
catch (HttpStatusCodeException e) {
if (e.getStatusCode() == HttpStatus.NOT_FOUND) {
return null;
}
throw VaultResponses.buildException(e, path);
}
});
}
示例2
@Nullable
private <T extends VaultResponseSupport<?>> T doUnwrap(VaultToken token,
BiFunction<RestOperations, HttpEntity<?>, T> requestFunction) {
return this.vaultOperations.doWithVault(restOperations -> {
try {
return requestFunction.apply(restOperations, new HttpEntity<>(VaultHttpHeaders.from(token)));
}
catch (HttpStatusCodeException e) {
if (e.getStatusCode() == HttpStatus.NOT_FOUND) {
return null;
}
if (e.getStatusCode() == HttpStatus.BAD_REQUEST
&& e.getResponseBodyAsString().contains("does not exist")) {
return null;
}
throw VaultResponses.buildException(e, "sys/wrapping/unwrap");
}
});
}
示例3
private <T extends VaultResponseSupport<?>> T writeAndReturn(String path, @Nullable Object body,
Class<T> responseType) {
Assert.hasText(path, "Path must not be empty");
T response = this.vaultOperations.doWithSession(restOperations -> {
try {
ResponseEntity<T> exchange = restOperations.exchange(path, HttpMethod.POST,
body == null ? HttpEntity.EMPTY : new HttpEntity<>(body), responseType);
return exchange.getBody();
}
catch (HttpStatusCodeException e) {
throw VaultResponses.buildException(e, path);
}
});
Assert.state(response != null, "Response must not be null");
return response;
}
示例4
/**
* Retrieve secrets from {@link VaultOperations}.
* @param requestedSecret the {@link RequestedSecret} providing the secret
* {@code path}.
* @return the response.
*/
@Nullable
protected VaultResponseSupport<Map<String, Object>> doGetSecrets(RequestedSecret requestedSecret) {
try {
VaultResponseSupport<Map<String, Object>> secrets;
if (this.keyValueDelegate.isVersioned(requestedSecret.getPath())) {
secrets = this.keyValueDelegate.getSecret(requestedSecret.getPath());
}
else {
secrets = this.operations.read(requestedSecret.getPath());
}
if (secrets == null) {
onSecretsNotFound(requestedSecret);
}
return secrets;
}
catch (RuntimeException e) {
onError(requestedSecret, Lease.none(), e);
return null;
}
}
示例5
@Test
void readObjectShouldReadDomainClass() {
Map<String, String> data = new HashMap<String, String>();
data.put("firstname", "Walter");
data.put("password", "Secret");
this.vaultOperations.write("secret/mykey", data);
VaultResponseSupport<Person> read = this.vaultOperations.read("secret/mykey", Person.class);
assertThat(read).isNotNull();
Person person = read.getRequiredData();
assertThat(person.getFirstname()).isEqualTo("Walter");
assertThat(person.getPassword()).isEqualTo("Secret");
}
示例6
private <T> T getRequest(String path, Class<T> clazz) throws SecretNotAccessibleException {
try {
VaultResponseSupport<T> response = vaultTemplate.read(path, clazz);
if (response != null) {
return response.getData();
} else {
throw new SecretNotAccessibleException(String.format("The secret %s is not available or in the wrong format.", path));
}
} catch (VaultException exception) {
throw new SecretNotAccessibleException(
String.format("Couldn't load secret from vault path %s", path), exception);
}
}
示例7
/**
* Create a {@link ParameterizedTypeReference} for {@code responseType}.
* @param responseType must not be {@literal null}.
* @return the {@link ParameterizedTypeReference} for {@code responseType}.
*/
public static <T> ParameterizedTypeReference<VaultResponseSupport<T>> getTypeReference(
final Class<T> responseType) {
Assert.notNull(responseType, "Response type must not be null");
final Type supportType = new ParameterizedType() {
@Override
public Type[] getActualTypeArguments() {
return new Type[] { responseType };
}
@Override
public Type getRawType() {
return VaultResponseSupport.class;
}
@Override
public Type getOwnerType() {
return VaultResponseSupport.class;
}
};
return new ParameterizedTypeReference<VaultResponseSupport<T>>() {
@Override
public Type getType() {
return supportType;
}
};
}
示例8
@Nullable
private <T> Versioned<T> doRead(String path, Version version, Class<T> responseType) {
String secretPath = version.isVersioned()
? String.format("%s?version=%d", createDataPath(path), version.getVersion()) : createDataPath(path);
VersionedResponse response = this.vaultOperations.doWithSession(restOperations -> {
try {
return restOperations.exchange(secretPath, HttpMethod.GET, null, VersionedResponse.class).getBody();
}
catch (HttpStatusCodeException e) {
if (e.getStatusCode() == HttpStatus.NOT_FOUND) {
if (e.getResponseBodyAsString().contains("deletion_time")) {
return VaultResponses.unwrap(e.getResponseBodyAsString(), VersionedResponse.class);
}
return null;
}
throw VaultResponses.buildException(e, path);
}
});
if (response == null) {
return null;
}
VaultResponseSupport<JsonNode> data = response.getRequiredData();
Metadata metadata = getMetadata(data.getMetadata());
T body = deserialize(data.getRequiredData(), responseType);
return Versioned.create(body, metadata);
}
示例9
@Override
@SuppressWarnings({ "rawtypes", "unchecked" })
public VaultMetadataResponse get(String path) {
VaultResponseSupport<Map> response = this.vaultOperations.read(getPath(path), Map.class);
return response != null ? fromMap(response.getRequiredData()) : null;
}
示例10
@Nullable
@Override
@SuppressWarnings("unchecked")
public <T> VaultResponseSupport<T> get(String path, Class<T> responseType) {
Assert.hasText(path, "Path must not be empty");
Assert.notNull(responseType, "Response type must not be null");
return doRead(path, responseType, (response, data) -> {
VaultResponseSupport result = response;
result.setData(data);
return result;
});
}
示例11
@Nullable
@Override
@SuppressWarnings("unchecked")
public <T> VaultResponseSupport<T> get(String path, Class<T> responseType) {
Assert.hasText(path, "Path must not be empty");
Assert.notNull(responseType, "Response type must not be null");
return doRead(path, responseType, (response, data) -> {
VaultResponseSupport result = response;
result.setData(data);
return result;
});
}
示例12
@Nullable
@Override
public <T> VaultResponseSupport<T> read(VaultToken token, Class<T> responseType) {
ParameterizedTypeReference<VaultResponseSupport<T>> ref = VaultResponses.getTypeReference(responseType);
return doUnwrap(token, (restOperations, entity) -> {
return restOperations.exchange("sys/wrapping/unwrap", HttpMethod.POST, entity, ref).getBody();
});
}
示例13
@Override
@Nullable
public RawTransitKey exportKey(String keyName, TransitKeyType type) {
Assert.hasText(keyName, "Key name must not be empty");
Assert.notNull(type, "Key type must not be null");
VaultResponseSupport<RawTransitKeyImpl> result = this.vaultOperations
.read(String.format("%s/export/%s/%s", this.path, type.getValue(), keyName), RawTransitKeyImpl.class);
return result != null ? result.getRequiredData() : null;
}
示例14
@Override
@Nullable
public VaultTransitKey getKey(String keyName) {
Assert.hasText(keyName, "Key name must not be empty");
VaultResponseSupport<VaultTransitKeyImpl> result = this.vaultOperations
.read(String.format("%s/keys/%s", this.path, keyName), VaultTransitKeyImpl.class);
if (result != null) {
return result.getRequiredData();
}
return null;
}
示例15
private void start(RequestedSecret requestedSecret, LeaseRenewalScheduler renewalScheduler) {
VaultResponseSupport<Map<String, Object>> secrets = doGetSecrets(requestedSecret);
if (secrets != null) {
Lease lease;
if (StringUtils.hasText(secrets.getLeaseId())) {
lease = Lease.of(secrets.getLeaseId(), Duration.ofSeconds(secrets.getLeaseDuration()),
secrets.isRenewable());
}
else if (isRotatingGenericSecret(requestedSecret, secrets)) {
lease = Lease.fromTimeToLive(Duration.ofSeconds(secrets.getLeaseDuration()));
}
else {
lease = Lease.none();
}
if (renewalScheduler.isLeaseRenewable(lease, requestedSecret)) {
scheduleLeaseRenewal(requestedSecret, lease, renewalScheduler);
}
else if (renewalScheduler.isLeaseRotateOnly(lease, requestedSecret)) {
scheduleLeaseRotation(requestedSecret, lease, renewalScheduler);
}
onSecretsObtained(requestedSecret, lease, secrets.getRequiredData());
}
}
示例16
@Override
JsonNode getJsonNode(VaultResponseSupport<JsonNode> response) {
return response.getRequiredData();
}
示例17
/**
* Read a secret at {@code path} and deserialize the {@literal data} element to the
* given {@link Class type}.
* @param path must not be {@literal null}.
* @param deserializeAs must not be {@literal null}.
* @param mappingFunction Mapping function to convert from the intermediate to the
* target data type. Must not be {@literal null}.
* @param <I> intermediate data type for {@literal data} deserialization.
* @param <T> return type. Value is created by the {@code mappingFunction}.
* @return mapped value.
*/
@Nullable
<I, T> T doRead(String path, Class<I> deserializeAs, BiFunction<VaultResponseSupport<?>, I, T> mappingFunction) {
ParameterizedTypeReference<VaultResponseSupport<JsonNode>> ref = VaultResponses
.getTypeReference(JsonNode.class);
VaultResponseSupport<JsonNode> response = doRead(createDataPath(path), ref);
if (response != null) {
JsonNode jsonNode = getJsonNode(response);
return mappingFunction.apply(response, deserialize(jsonNode, deserializeAs));
}
return null;
}
示例18
JsonNode getJsonNode(VaultResponseSupport<JsonNode> response) {
return response.getRequiredData().at("/data");
}
示例19
private static boolean isRotatingGenericSecret(RequestedSecret requestedSecret,
VaultResponseSupport<Map<String, Object>> secrets) {
return Mode.ROTATE.equals(requestedSecret.getMode()) && !secrets.isRenewable()
&& secrets.getLeaseDuration() > 0;
}
示例20
public static void main(String[] args) {
VaultTemplate vaultTemplate = new VaultTemplate(new VaultEndpoint(),
new TokenAuthentication("00000000-0000-0000-0000-000000000000"));
Secrets secrets = new Secrets();
secrets.username = "hello";
secrets.password = "world";
vaultTemplate.write("secret/myapp", secrets);
VaultResponseSupport<Secrets> response = vaultTemplate.read("secret/myapp", Secrets.class);
System.out.println(response.getRequiredData().getUsername());
vaultTemplate.delete("secret/myapp");
}
示例21
/**
* To Retrieve Credentials
* @return Credentials
* @throws URISyntaxException
*/
public Credentials accessCredentials() throws URISyntaxException {
VaultResponseSupport<Credentials> response = vaultTemplate.read("credentials/myapp", Credentials.class);
return response.getData();
}
示例22
@Override
public <T> Mono<VaultResponseSupport<T>> read(String path, Class<T> responseType) {
return doWithSession(webClient -> {
ParameterizedTypeReference<VaultResponseSupport<T>> ref = VaultResponses.getTypeReference(responseType);
return webClient.get().uri(path).exchange().flatMap(mapResponse(ref, path, HttpMethod.GET));
});
}
示例23
@Test
void shouldReadWrappedTypedSecret() {
Map<String, String> map = Collections.singletonMap("key", "value");
WrappedMetadata metadata = this.wrappingOperations.wrap(map, Duration.ofSeconds(100));
VaultResponseSupport<Secret> response = this.wrappingOperations.read(metadata.getToken(), Secret.class);
assertThat(response.getRequiredData()).isEqualTo(new Secret("value"));
}
示例24
/**
* Read a wrapped secret of type {@link Class responseType}.
* @param token must not be {@literal null}.
* @param responseType must not be {@literal null}.
* @return the data or {@literal null} if the token was invalid or expired.
*/
@Nullable
<T> VaultResponseSupport<T> read(VaultToken token, Class<T> responseType);
示例25
/**
* Read the secret at {@code path}.
* @param path must not be {@literal null}.
* @param responseType must not be {@literal null}.
* @return the data. May be {@literal null} if the path does not exist.
*/
@Nullable
<T> VaultResponseSupport<T> get(String path, Class<T> responseType);
示例26
/**
* Return the {@link JsonNode} that contains the actual response body.
* @param response
* @return
*/
abstract JsonNode getJsonNode(VaultResponseSupport<JsonNode> response);
示例27
/**
* Read from a Vault path. Reading data using this method is suitable for API
* calls/secret backends that do not require a request body.
* @param path must not be {@literal null}.
* @param responseType must not be {@literal null}.
* @return the data. May be empty if the path does not exist.
*/
<T> Mono<VaultResponseSupport<T>> read(String path, Class<T> responseType);
示例28
/**
* Read from a secret backend. Reading data using this method is suitable for secret
* backends that do not require a request body.
* @param path must not be {@literal null}.
* @param responseType must not be {@literal null}.
* @return the data. May be {@literal null} if the path does not exist.
*/
@Nullable
<T> VaultResponseSupport<T> read(String path, Class<T> responseType);