diff --git a/src/main/kotlin/com/auth/config/WebSecurityConfig.kt b/src/main/kotlin/com/auth/config/WebSecurityConfig.kt index a3d7e65..5a4235e 100644 --- a/src/main/kotlin/com/auth/config/WebSecurityConfig.kt +++ b/src/main/kotlin/com/auth/config/WebSecurityConfig.kt @@ -9,6 +9,8 @@ import org.springframework.security.config.annotation.web.configuration.EnableWe import org.springframework.security.config.annotation.web.configurers.CsrfConfigurer import org.springframework.security.config.annotation.web.configurers.SessionManagementConfigurer import org.springframework.security.config.http.SessionCreationPolicy +import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter +import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter import org.springframework.security.web.SecurityFilterChain @@ -23,8 +25,12 @@ class WebSecurityConfig () { http.authorizeHttpRequests(Customizer { auth -> auth.anyRequest().authenticated() }) .oauth2ResourceServer(Customizer { oauth2 -> - oauth2!!.jwt(Customizer.withDefaults()) - }) // ← проверяем JWT токен + // oauth2!!.jwt(Customizer.withDefaults()) + // добавляем конвертер для извлечения ролей + oauth2.jwt { jwt -> + jwt.jwtAuthenticationConverter(jwtAuthenticationConverter()) + } + }) // проверка JWT токен .sessionManagement(Customizer { session: SessionManagementConfigurer? -> session!!.sessionCreationPolicy(SessionCreationPolicy.STATELESS) }) // без сессий @@ -33,4 +39,17 @@ class WebSecurityConfig () { return http.build() } + // Конвертер JWT Authentication (извлекает роли из токена) + private fun jwtAuthenticationConverter(): JwtAuthenticationConverter { + val converter = JwtAuthenticationConverter() + + // Извлекаем роли из поля realm_access.roles + val authoritiesExtractor = JwtGrantedAuthoritiesConverter() + authoritiesExtractor.setAuthoritiesClaimName("realm_access.roles") // где лежат роли + authoritiesExtractor.setAuthorityPrefix("ROLE_") // добавляем префикс ROLE_ + + converter.setJwtGrantedAuthoritiesConverter(authoritiesExtractor) + return converter + } + } \ No newline at end of file