@galliard

Как в spring реализовать авторизацию по bearer токенам БЕЗ JWT?

Задача довольно простая, но я перерыл все интернеты и не нахожу решения. Весь интернет забит раздичными реализациями через 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 токенах вообще. И я не нашел, где и как это конфигурируется.

В общем, как мне осуществить задуманный мной способ аутентификации?
  • Вопрос задан
  • 87 просмотров
Пригласить эксперта
Ответы на вопрос 1
@My1Name
В контексте Authentication, нужно смотреть в сторону ручной авторизации (автоматическая авторизация после регистрации). Там всё достаточно просто и понятно. Ну а если хочется изобрести что-то новенькое, то нужно читать документацию: https://docs.spring.io/spring-security/site/docs/4...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы