diff --git a/src/app_state.rs b/src/app_state.rs index 4557ecb..59e29c3 100644 --- a/src/app_state.rs +++ b/src/app_state.rs @@ -26,6 +26,12 @@ impl AppState { Self::new_with_config(security_config).await } + /// Инициализация с кастомной конфигурацией безопасности и исправленным URL. + async fn new_with_config_and_url(security_config: SecurityConfig, redis_url: String) -> Self { + log::warn!("🔧 Creating AppState with corrected Redis URL"); + Self::create_app_state_with_redis_url(security_config, redis_url).await + } + /// Инициализация с кастомной конфигурацией безопасности. pub async fn new_with_config(security_config: SecurityConfig) -> Self { log::warn!("🚀 Starting AppState initialization..."); @@ -53,8 +59,26 @@ impl AppState { log::warn!("✅ Redis URL parsed successfully"); log::warn!(" Host: {}", parsed_url.host_str().unwrap_or("none")); log::warn!(" Port: {}", parsed_url.port().unwrap_or(0)); - log::warn!(" Username: '{}'", parsed_url.username()); - log::warn!(" Password: {}", if parsed_url.password().is_some() { "***" } else { "none" }); + + let username = parsed_url.username(); + let password = parsed_url.password(); + + // Определяем правильное имя пользователя + let effective_username = if username.is_empty() && password.is_some() { + "redis" // Дефолтное имя пользователя для Redis + } else { + username + }; + + log::warn!(" Username: '{}' (effective: '{}')", username, effective_username); + log::warn!(" Password: {}", if password.is_some() { "***" } else { "none" }); + + // Если нужно, исправляем URL с правильным именем пользователя + if username.is_empty() && password.is_some() { + let corrected_url = redis_url.replace("redis://:", &format!("redis://{}:", effective_username)); + log::warn!("🔧 Using corrected Redis URL: {}", corrected_url.replace(&corrected_url.split('@').nth(0).unwrap_or(""), "***")); + return Self::new_with_config_and_url(security_config, corrected_url).await; + } } Err(e) => { log::error!("❌ Failed to parse Redis URL: {}", e); @@ -62,6 +86,11 @@ impl AppState { } } + Self::create_app_state_with_redis_url(security_config, redis_url).await + } + + /// Создает AppState с указанным Redis URL. + async fn create_app_state_with_redis_url(security_config: SecurityConfig, redis_url: String) -> Self { let redis_client = match RedisClient::open(redis_url) { Ok(client) => { log::warn!("✅ Redis client created successfully"); diff --git a/src/handlers/common.rs b/src/handlers/common.rs index c3252a1..09df221 100644 --- a/src/handlers/common.rs +++ b/src/handlers/common.rs @@ -86,7 +86,7 @@ pub fn extract_and_validate_token(req: &HttpRequest) -> Result<&str, actix_web:: let token = token.ok_or_else(|| { warn!("Request without authorization token"); - ErrorUnauthorized("Authorization token required") + ErrorUnauthorized("Ok") })?; // Проверяем длину токена