4
respostas

Classes deprecadas

Estou com dificuldades em prosseguir com a aula atual devido às alterações mais recentes do SpringSecurity:

https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter

Eu fiz uma modificação na minha classe e gostaria de sabe se essa é a abordagem mais correta:


package br.com.architectbudgeplanner.config

import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
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 SecurityConfiguration {

    @Bean
    fun filterChain(http: HttpSecurity) : SecurityFilterChain {
        return http.authorizeHttpRequests {
            it.anyRequest().authenticated()
        }.sessionManagement {
            it.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        }.formLogin {
            it.disable()
        }.httpBasic(Customizer.withDefaults()).build()
    }

    @Bean
    fun encoder(): PasswordEncoder? {
        return BCryptPasswordEncoder()
    }
}
4 respostas

Oi!

Você pode deixar assim, para seguir o novo modelo:

@Configuration
@EnableWebSecurity
class SecurityConfiguration {
  
    @Bean
    fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
        http
            .csrf { it.disable() }
            .authorizeHttpRequests {
                it.anyRequest().authenticated()
            }
            .sessionManagement {
                it.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            }
            
        return http.build()
    }
  
    @Bean
    fun encoder(): PasswordEncoder = BCryptPasswordEncoder()

}

Obrigado pelo retorno, Rodrigo.

Atualizei o código com a implementação indicada, porém ao fazer uma request, ele me retornou um 403:

val client = OkHttpClient() val request = Request.Builder() .url("localhost:8080/categories") .addHeader("Authorization", "Basic ZnJhbmNpc2NvQGVtYWlsLmNvbToxMjM0NTY=") .build() val response = client.newCall(request).execute()

cURL curl --location 'localhost:8080/categories' --header 'Authorization: Basic ZnJhbmNpc2NvQGVtYWlsLmNvbToxMjM0NTY='

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Você já implementou a parte de autenticação no projeto?

Eu fiz uma modificação, cancatenando o httpBasic no final do método e voltou a retornar 200 quando autenticado. Passando uma senha ou username incorreto, ele retorna 401, como esperado.

Veja como ficou:

@Configuration
@EnableWebSecurity
class SecurityConfiguration {

    @Bean
    fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
        return http
            .csrf { it.disable() }
            .authorizeHttpRequests {
                it.anyRequest().authenticated()
            }
            .sessionManagement {
                it.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            }.httpBasic(Customizer.withDefaults()).build()
    }

    @Bean
    fun encoder(): PasswordEncoder = BCryptPasswordEncoder()

}

Sim, eu configurei a parte de autenticação, e nesse momento está assim:

SecutiryConfiguration (colada acima)

Service resumida

@Service
class CostumerService(
    private val repository: CostumerRepository,
    private val costumerFormMapper: CostumerFormMapper,
    private val costumerViewMapper: CostumerViewMapper,
    private val passwordEncoder: PasswordEncoder
    
        override fun loadUserByUsername(username: String?): UserDetail {
        val user = repository.findByEmail(username) ?: throw NotFoundException(ErrorMessage.RESOURCE_NOT_FOUND)
        return UserDetail(user)
    }

UserDetail

class UserDetail(
    private val costumer: Costumer
)  : UserDetails{
    override fun getAuthorities() = null

    override fun getPassword() = costumer.password

    override fun getUsername() = costumer.email

    override fun isAccountNonExpired() = true

    override fun isAccountNonLocked() = true

    override fun isCredentialsNonExpired() = true

    override fun isEnabled() = true
}