From 705d686bb2e0c82aef1e38eff19ea99c6972958d Mon Sep 17 00:00:00 2001 From: "dmitriy.churmeev" Date: Sun, 29 Mar 2026 16:29:48 +0300 Subject: [PATCH] fix security configuration --- .../com/test/{test => }/TestApplication.kt | 2 +- .../auth/config/WebSecurityConfig.kt | 58 ++++++++++--------- .../test/{test => }/rest/TestController.kt | 6 +- 3 files changed, 35 insertions(+), 31 deletions(-) rename src/main/kotlin/com/test/{test => }/TestApplication.kt (91%) rename src/main/kotlin/com/{ => test}/auth/config/WebSecurityConfig.kt (67%) rename src/main/kotlin/com/test/{test => }/rest/TestController.kt (88%) diff --git a/src/main/kotlin/com/test/test/TestApplication.kt b/src/main/kotlin/com/test/TestApplication.kt similarity index 91% rename from src/main/kotlin/com/test/test/TestApplication.kt rename to src/main/kotlin/com/test/TestApplication.kt index e81892d..900c317 100644 --- a/src/main/kotlin/com/test/test/TestApplication.kt +++ b/src/main/kotlin/com/test/TestApplication.kt @@ -1,4 +1,4 @@ -package com.test.test +package com.test import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication diff --git a/src/main/kotlin/com/auth/config/WebSecurityConfig.kt b/src/main/kotlin/com/test/auth/config/WebSecurityConfig.kt similarity index 67% rename from src/main/kotlin/com/auth/config/WebSecurityConfig.kt rename to src/main/kotlin/com/test/auth/config/WebSecurityConfig.kt index f967c18..54447b6 100644 --- a/src/main/kotlin/com/auth/config/WebSecurityConfig.kt +++ b/src/main/kotlin/com/test/auth/config/WebSecurityConfig.kt @@ -1,5 +1,6 @@ -package com.auth.config +package com.test.auth.config +import org.slf4j.LoggerFactory import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.security.config.Customizer @@ -12,13 +13,16 @@ import org.springframework.security.config.http.SessionCreationPolicy import org.springframework.security.core.authority.SimpleGrantedAuthority import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter import org.springframework.security.web.SecurityFilterChain +import org.springframework.core.convert.converter.Converter +import org.springframework.security.core.GrantedAuthority +import org.springframework.security.oauth2.jwt.Jwt @Configuration @EnableWebSecurity @EnableMethodSecurity class WebSecurityConfig { - private val logger = org.slf4j.LoggerFactory.getLogger(WebSecurityConfig::class.java) + private val logger = LoggerFactory.getLogger(WebSecurityConfig::class.java) @Bean @Throws(Exception::class) @@ -52,41 +56,41 @@ class WebSecurityConfig { val converter = JwtAuthenticationConverter() - converter.setJwtGrantedAuthoritiesConverter { jwt -> - logger.info("=== JWT Converter called for token ===") + // 🔑 КЛЮЧЕВОЕ ИЗМЕНЕНИЕ: используем явный объект вместо лямбды + converter.setJwtGrantedAuthoritiesConverter( + Converter> { jwt -> + logger.info("=== JWT Converter called for token ===") - val roles = mutableSetOf() + val roles = mutableSetOf() - // Извлекаем роли из resource_access.test_client.roles - val resourceAccess = jwt.claims["resource_access"] as? Map<*, *> - logger.info("resource_access: $resourceAccess") + val resourceAccess = jwt.claims["resource_access"] as? Map<*, *> + logger.info("resource_access: $resourceAccess") - val clientAccess = resourceAccess?.get("test_client") as? Map<*, *> - val clientRoles = clientAccess?.get("roles") as? List<*> + val clientAccess = resourceAccess?.get("test_client") as? Map<*, *> + val clientRoles = clientAccess?.get("roles") as? List<*> - clientRoles?.forEach { role -> - logger.info("Adding ROLE_$role") - roles.add(SimpleGrantedAuthority("ROLE_$role")) + clientRoles?.forEach { role -> + logger.info("Adding ROLE_$role") + roles.add(SimpleGrantedAuthority("ROLE_$role")) + } + + val realmAccess = jwt.claims["realm_access"] as? Map<*, *> + val realmRoles = realmAccess?.get("roles") as? List<*> + + realmRoles?.forEach { role -> + logger.info("Adding realm ROLE_$role") + roles.add(SimpleGrantedAuthority("ROLE_$role")) + } + + logger.info("Final authorities: ${roles.map { it.authority }}") + roles.toList() } - - // Альтернативно: можно также читать из realm_access.roles - val realmAccess = jwt.claims["realm_access"] as? Map<*, *> - val realmRoles = realmAccess?.get("roles") as? List<*> - - realmRoles?.forEach { role -> - logger.info("Adding realm ROLE_$role") - roles.add(SimpleGrantedAuthority("ROLE_$role")) - } - - logger.info("Final authorities: ${roles.map { it.authority }}") - roles.toList() - } + ) return converter } - // // Конвертер JWT Authentication (извлекает роли из токена) // private fun jwtAuthenticationConverter(): JwtAuthenticationConverter { // val converter = JwtAuthenticationConverter() diff --git a/src/main/kotlin/com/test/test/rest/TestController.kt b/src/main/kotlin/com/test/rest/TestController.kt similarity index 88% rename from src/main/kotlin/com/test/test/rest/TestController.kt rename to src/main/kotlin/com/test/rest/TestController.kt index 7a971bd..e9c117c 100644 --- a/src/main/kotlin/com/test/test/rest/TestController.kt +++ b/src/main/kotlin/com/test/rest/TestController.kt @@ -1,6 +1,6 @@ -package com.test.test.rest +package com.test.rest -import com.auth.config.WebSecurityConfig +import org.slf4j.LoggerFactory import org.springframework.security.access.prepost.PreAuthorize import org.springframework.security.core.Authentication import org.springframework.security.core.context.SecurityContextHolder @@ -11,7 +11,7 @@ import org.springframework.web.bind.annotation.RestController @RestController open class TestController { - private val logger = org.slf4j.LoggerFactory.getLogger(TestController::class.java) + private val logger = LoggerFactory.getLogger(TestController::class.java) @PreAuthorize("hasRole('ADMIN')")