Задача довольно простая, но я перерыл все интернеты и не нахожу решения. Весь интернет забит раздичными реализациями через JWT, ноторый мне не нужен. Я же хочу сделать обычные токены, просто набор рандомных символов, хранящихся в БД и привязанных к юзеру. Код получился примерно такой:
package com.exchange.security
import com.exchange.service.UserService
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.http.HttpMethod
import org.springframework.security.authentication.AuthenticationProvider
import org.springframework.security.authentication.dao.DaoAuthenticationProvider
import org.springframework.security.config.Customizer
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
import org.springframework.security.config.http.SessionCreationPolicy
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
import org.springframework.security.crypto.password.PasswordEncoder
import org.springframework.security.web.SecurityFilterChain
@Configuration
@EnableWebSecurity
class SecurityConfig (
private val userDetailsService: UserService,
) {
@Bean
fun filterChain(http: HttpSecurity): SecurityFilterChain {
http
.csrf { csrf -> csrf.disable() }
.authenticationProvider(authenticationProvider())
.authorizeHttpRequests { auth ->
auth
.requestMatchers(HttpMethod.POST, "/api/auth").permitAll()
.requestMatchers("/api/**").authenticated()
.anyRequest().authenticated()
}
.sessionManagement { sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS) }
.httpBasic(Customizer.withDefaults())
return http.build()
}
@Bean
fun authenticationProvider() : AuthenticationProvider {
val authProvider = DaoAuthenticationProvider()
authProvider.setUserDetailsService(userDetailsService)
authProvider.setPasswordEncoder(encoder())
return authProvider
}
@Bean
fun encoder(): PasswordEncoder {
return BCryptPasswordEncoder()
}
}
Все, что смог найти в интернетах - это использование AuthenticationProvider, однако есть пара проблем:
1. Он не работает
2. Не понятно, как вообще он может работать, AuthenticationProvider принимает в себя только сервис хеширования паролей и сервис поиска юзера по логину, но как получить логин пользователя по bearer токену он не знает, как и о каких-то bearer токенах вообще. И я не нашел, где и как это конфигурируется.
В общем, как мне осуществить задуманный мной способ аутентификации?