From 312c18645b405d01a36ad6a2d3a5cdb8cb82baa0 Mon Sep 17 00:00:00 2001 From: skettiks Date: Thu, 23 Apr 2026 23:59:16 +0300 Subject: [PATCH] =?UTF-8?q?-=20=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D1=91=D0=BD=20OAuth2UserInfo.kt=20=D0=B8=D0=B7=20adapters/secu?= =?UTF-8?q?rity/=20=D0=B2=20application/ports/input/security/;=20=D0=BE?= =?UTF-8?q?=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B8=D0=BC?= =?UTF-8?q?=D0=BF=D0=BE=D1=80=D1=82=D1=8B=20=D0=B2=D0=BE=20=D0=B2=D1=81?= =?UTF-8?q?=D0=B5=D1=85=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC=D1=8B?= =?UTF-8?q?=D1=85=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - В UserPrincipal.kt заменён star import java.util.* на явный java.util.UUID. - В YandexOAuth2UserInfo.kt и VkOAuth2UserInfo.kt убрана аннотация @Suppress("UNCHECKED_CAST") - В build.gradle.kts хардкод версии заменён на version catalog - Из CustomOAuth2UserService.kt удалены комментарии на русском языке --- build.gradle.kts | 3 +-- .../security/CustomOAuth2UserService.kt | 4 +--- .../adapters/security/GoogleOAuth2UserInfo.kt | 2 ++ .../security/OAuth2UserInfoFactory.kt | 1 + .../adapters/security/UserPrincipal.kt | 2 +- .../adapters/security/VkOAuth2UserInfo.kt | 20 +++++++++++-------- .../adapters/security/YandexOAuth2UserInfo.kt | 12 +++++++---- .../ports/input}/security/OAuth2UserInfo.kt | 2 +- 8 files changed, 27 insertions(+), 19 deletions(-) rename src/main/kotlin/com/project/movienight/{adapters => application/ports/input}/security/OAuth2UserInfo.kt (74%) diff --git a/build.gradle.kts b/build.gradle.kts index 2d2ed27..a5b9744 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -46,8 +46,7 @@ dependencies { implementation(libs.spring.grpc.starter) implementation(libs.grpc.services) - - implementation("org.springframework.boot:spring-boot-starter-oauth2-client:3.4.3") + implementation(libs.spring.boot.starter.oauth2.client) runtimeOnly(libs.micrometer.registry.prometheus) runtimeOnly(libs.h2) diff --git a/src/main/kotlin/com/project/movienight/adapters/security/CustomOAuth2UserService.kt b/src/main/kotlin/com/project/movienight/adapters/security/CustomOAuth2UserService.kt index 968424a..cc1cb8d 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/CustomOAuth2UserService.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security/CustomOAuth2UserService.kt @@ -1,5 +1,6 @@ package com.project.movienight.adapters.security +import com.project.movienight.application.ports.input.security.OAuth2UserInfo import com.project.movienight.application.ports.output.IdGenerator import com.project.movienight.application.ports.output.UserRepositoryPort import com.project.movienight.domain.model.User @@ -37,7 +38,6 @@ class CustomOAuth2UserService( } private fun findOrCreateUser(userInfo: OAuth2UserInfo): User { - // Сначала ищем по provider + provider_id (основной способ для OAuth2) val existingUser = userRepository.findByProviderAndProviderId( userInfo.getProvider(), userInfo.getProviderId() @@ -47,11 +47,9 @@ class CustomOAuth2UserService( log.debug("User found by provider: {}", userInfo.getProvider()) existingUser } else { - // Проверяем нет ли пользователя с таким email (связывание аккаунтов) val userByEmail = userRepository.findByEmail(userInfo.getEmail()) if (userByEmail != null) { - // Пользователь существует, обновляем его OAuth2 данными log.debug("Linking OAuth2 account to existing user: {}", userInfo.getEmail()) userRepository.saveWithOAuth2(userByEmail, userInfo.getProvider(), userInfo.getProviderId()) } else { diff --git a/src/main/kotlin/com/project/movienight/adapters/security/GoogleOAuth2UserInfo.kt b/src/main/kotlin/com/project/movienight/adapters/security/GoogleOAuth2UserInfo.kt index fa41de5..c463ac6 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/GoogleOAuth2UserInfo.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security/GoogleOAuth2UserInfo.kt @@ -1,5 +1,7 @@ package com.project.movienight.adapters.security +import com.project.movienight.application.ports.input.security.OAuth2UserInfo + class GoogleOAuth2UserInfo( private val attributes: Map ) : OAuth2UserInfo { diff --git a/src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfoFactory.kt b/src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfoFactory.kt index e2db545..89d6d30 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfoFactory.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfoFactory.kt @@ -1,5 +1,6 @@ package com.project.movienight.adapters.security +import com.project.movienight.application.ports.input.security.OAuth2UserInfo import org.springframework.security.oauth2.core.OAuth2AuthenticationException import org.springframework.security.oauth2.core.user.OAuth2User diff --git a/src/main/kotlin/com/project/movienight/adapters/security/UserPrincipal.kt b/src/main/kotlin/com/project/movienight/adapters/security/UserPrincipal.kt index a4d94ea..c602211 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/UserPrincipal.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security/UserPrincipal.kt @@ -5,7 +5,7 @@ import org.springframework.security.core.GrantedAuthority import org.springframework.security.core.authority.SimpleGrantedAuthority import org.springframework.security.core.userdetails.UserDetails import org.springframework.security.oauth2.core.user.OAuth2User -import java.util.* +import java.util.UUID class UserPrincipal( private val user: User, diff --git a/src/main/kotlin/com/project/movienight/adapters/security/VkOAuth2UserInfo.kt b/src/main/kotlin/com/project/movienight/adapters/security/VkOAuth2UserInfo.kt index 47c41d2..e2c55c0 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/VkOAuth2UserInfo.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security/VkOAuth2UserInfo.kt @@ -1,22 +1,26 @@ package com.project.movienight.adapters.security -@Suppress("UNCHECKED_CAST") +import com.project.movienight.application.ports.input.security.OAuth2UserInfo + class VkOAuth2UserInfo( private val attributes: Map ) : OAuth2UserInfo { override fun getProviderId(): String { - val response = attributes["response"] as? List> - return response?.firstOrNull()?.get("id")?.toString() ?: "" + return (attributes["response"] as? List<*>) + ?.firstOrNull() + ?.let { it as? Map<*, *> } + ?.get("id") + ?.toString() ?: "" } - override fun getEmail(): String = attributes["email"] as? String ?: "" + override fun getEmail(): String = attributes["email"]?.toString() ?: "" override fun getName(): String { - val response = attributes["response"] as? List> - val first = response?.firstOrNull() - val firstName = first?.get("first_name") as? String ?: "" - val lastName = first?.get("last_name") as? String ?: "" + val response = attributes["response"] as? List<*> + val first = response?.firstOrNull() as? Map<*, *> + val firstName = first?.get("first_name")?.toString() ?: "" + val lastName = first?.get("last_name")?.toString() ?: "" return "$firstName $lastName".trim() } diff --git a/src/main/kotlin/com/project/movienight/adapters/security/YandexOAuth2UserInfo.kt b/src/main/kotlin/com/project/movienight/adapters/security/YandexOAuth2UserInfo.kt index 467aa85..59bf3eb 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/YandexOAuth2UserInfo.kt +++ b/src/main/kotlin/com/project/movienight/adapters/security/YandexOAuth2UserInfo.kt @@ -1,6 +1,7 @@ package com.project.movienight.adapters.security -@Suppress("UNCHECKED_CAST") +import com.project.movienight.application.ports.input.security.OAuth2UserInfo + class YandexOAuth2UserInfo( private val attributes: Map ) : OAuth2UserInfo { @@ -8,11 +9,14 @@ class YandexOAuth2UserInfo( override fun getProviderId(): String = attributes["id"]?.toString() ?: "" override fun getEmail(): String { - val emails = attributes["emails"] as? List> - return emails?.firstOrNull()?.get("value") ?: "" + return (attributes["emails"] as? List<*>) + ?.firstOrNull() + ?.let { it as? Map<*, *> } + ?.get("value") + ?.toString() ?: "" } - override fun getName(): String = attributes["display_name"] as? String ?: "" + override fun getName(): String = attributes["display_name"]?.toString() ?: "" override fun getProvider(): String = "yandex" diff --git a/src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfo.kt b/src/main/kotlin/com/project/movienight/application/ports/input/security/OAuth2UserInfo.kt similarity index 74% rename from src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfo.kt rename to src/main/kotlin/com/project/movienight/application/ports/input/security/OAuth2UserInfo.kt index b6abf09..c081592 100644 --- a/src/main/kotlin/com/project/movienight/adapters/security/OAuth2UserInfo.kt +++ b/src/main/kotlin/com/project/movienight/application/ports/input/security/OAuth2UserInfo.kt @@ -1,4 +1,4 @@ -package com.project.movienight.adapters.security +package com.project.movienight.application.ports.input.security interface OAuth2UserInfo { fun getProviderId(): String