All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.scalecube.services.security.ServiceTokenCredentialsSupplier Maven / Gradle / Ivy

The newest version!
package io.scalecube.services.security;

import io.scalecube.security.vault.VaultServiceTokenSupplier;
import io.scalecube.services.auth.CredentialsSupplier;
import io.scalecube.services.exceptions.ForbiddenException;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.function.Supplier;
import reactor.core.publisher.Mono;

public class ServiceTokenCredentialsSupplier implements CredentialsSupplier {

  private final String environment;
  private final String vaultAddress;
  private final Supplier> vaultTokenSupplier;
  private final Collection allowedRoles;

  /**
   * Constructor.
   *
   * @param environment logical environment name
   * @param vaultAddress vaultAddress
   * @param vaultTokenSupplier vaultTokenSupplier
   * @param allowedRoles allowedRoles (optional)
   */
  public ServiceTokenCredentialsSupplier(
      String environment,
      String vaultAddress,
      Supplier> vaultTokenSupplier,
      Collection allowedRoles) {
    this.environment = Objects.requireNonNull(environment, "environment");
    this.vaultAddress = Objects.requireNonNull(vaultAddress, "vaultAddress");
    this.vaultTokenSupplier = Objects.requireNonNull(vaultTokenSupplier, "vaultTokenSupplier");
    this.allowedRoles = allowedRoles;
  }

  @Override
  public Mono credentials(String service, List serviceRoles) {
    return Mono.defer(
        () -> {
          if (serviceRoles == null || serviceRoles.isEmpty()) {
            return Mono.just(new byte[0]);
          }

          String serviceRole = null;

          if (allowedRoles == null || allowedRoles.isEmpty()) {
            serviceRole = serviceRoles.get(0);
          } else {
            for (var allowedRole : allowedRoles) {
              if (serviceRoles.contains(allowedRole)) {
                serviceRole = allowedRole;
              }
            }
          }

          if (serviceRole == null) {
            throw new ForbiddenException("Insufficient permissions");
          }

          return Mono.fromFuture(
                  VaultServiceTokenSupplier.builder()
                      .vaultAddress(vaultAddress)
                      .serviceRole(serviceRole)
                      .vaultTokenSupplier(vaultTokenSupplier)
                      .serviceTokenNameBuilder(
                          (role, tags) -> String.join(".", environment, service, role))
                      .build()
                      .getToken(Collections.emptyMap()))
              .map(String::getBytes);
        });
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy