Support auth header

This commit is contained in:
kssenii 2024-11-14 19:56:51 +01:00
parent 326c91c02b
commit 0e14b49298
3 changed files with 33 additions and 1 deletions

View File

@ -1,6 +1,8 @@
#include <Databases/Iceberg/DatabaseIceberg.h>
#if USE_AVRO
#include <Access/Common/HTTPAuthenticationScheme.h>
#include <Databases/DatabaseFactory.h>
#include <Databases/Iceberg/RestCatalog.h>
#include <DataTypes/DataTypeString.h>
@ -27,6 +29,7 @@ namespace DB
namespace DatabaseIcebergSetting
{
extern const DatabaseIcebergSettingsString storage_endpoint;
extern const DatabaseIcebergSettingsString auth_header;
extern const DatabaseIcebergSettingsDatabaseIcebergCatalogType catalog_type;
extern const DatabaseIcebergSettingsDatabaseIcebergStorageType storage_type;
}
@ -52,6 +55,20 @@ namespace
auto namespace_name = name.substr(0, name.size() - table_name.size() - 1);
return {namespace_name, table_name};
}
void setCredentials(Poco::Net::HTTPBasicCredentials & credentials, const Poco::URI & request_uri)
{
const auto & user_info = request_uri.getUserInfo();
if (!user_info.empty())
{
std::size_t n = user_info.find(':');
if (n != std::string::npos)
{
credentials.setUsername(user_info.substr(0, n));
credentials.setPassword(user_info.substr(n + 1));
}
}
}
}
DatabaseIceberg::DatabaseIceberg(
@ -65,6 +82,17 @@ DatabaseIceberg::DatabaseIceberg(
, database_engine_definition(database_engine_definition_)
, log(getLogger("DatabaseIceberg(" + database_name_ + ")"))
{
setCredentials(credentials, Poco::URI(url));
const auto auth_header = settings[DatabaseIcebergSetting::auth_header].value;
if (!auth_header.empty())
{
auto pos = auth_header.find(':');
if (pos == std::string::npos)
throw Exception(ErrorCodes::BAD_ARGUMENTS, "Unexpected format of auth header");
headers.emplace_back(auth_header.substr(0, pos), auth_header.substr(pos + 1));
}
}
std::unique_ptr<Iceberg::ICatalog> DatabaseIceberg::getCatalog(ContextPtr context_) const

View File

@ -6,6 +6,7 @@
#include <Databases/Iceberg/DatabaseIcebergSettings.h>
#include <Databases/Iceberg/ICatalog.h>
#include <Storages/ObjectStorage/StorageObjectStorage.h>
#include <Poco/Net/HTTPBasicCredentials.h>
namespace DB
{
@ -53,8 +54,10 @@ private:
const DatabaseIcebergSettings settings;
/// Database engine definition taken from initial CREATE DATABASE query.
const ASTPtr database_engine_definition;
const LoggerPtr log;
/// Crendetials to authenticate Iceberg Catalog.
Poco::Net::HTTPBasicCredentials credentials;
HTTPHeaderEntries headers;
std::unique_ptr<Iceberg::ICatalog> getCatalog(ContextPtr context_) const;
std::shared_ptr<StorageObjectStorage::Configuration> getConfiguration() const;

View File

@ -17,6 +17,7 @@ namespace ErrorCodes
#define DATABASE_ICEBERG_RELATED_SETTINGS(DECLARE, ALIAS) \
DECLARE(DatabaseIcebergCatalogType, catalog_type, DatabaseIcebergCatalogType::REST, "Catalog type", 0) \
DECLARE(DatabaseIcebergStorageType, storage_type, DatabaseIcebergStorageType::S3, "Storage type: S3, Local, Azure, HDFS", 0) \
DECLARE(String, auth_header, "", "Authorization header of format 'Authorization: <scheme> <auth_info>'", 0) \
DECLARE(String, storage_endpoint, "", "Object storage endpoint", 0) \
#define LIST_OF_DATABASE_ICEBERG_SETTINGS(M, ALIAS) \