Estou tomando um '403 Forbidden' na chamada com httpBasic via Insomnia e ainda não descobri o que está errado; mesmo utilizando a mesma configuração da aula ainda assim recebo o formulário de login se fizer um GET via browser para as URIs /topicos e/ou /topicos/{id}. Obs: se no formulário de login via browser eu utilizar o email e senha cadastrado no banco consigo autenticar e receber um body vazio ou um 404 se passar um id qualquer.
ALTER TABLE usuario ADD COLUMN password text;
UPDATE usuario SET password = '$2a$12$3ilD9q6f6DqNeUMM55cffuhmHJ0dqN1rKTSwxNKPvc77iUMI.2sY.' WHERE id = 1;
@Entity
data class Usuario(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null,
val nome: String,
val email: String,
val password: String
)
@Configuration
@EnableWebSecurity
class SecurityConfiguration(
private val userDetailsService: UserDetailsService
) : WebSecurityConfigurerAdapter() {
override fun configure(http: HttpSecurity?) {
http?.
authorizeRequests()?.
antMatchers("/topicos")?.hasAuthority("LEITURA_ESCRITA")?.
anyRequest()?.
authenticated()?.
and()?.
sessionManagement()?.sessionCreationPolicy(SessionCreationPolicy.STATELESS)?.
and()?.
formLogin()?.disable()?.
httpBasic()
}
override fun configure(auth: AuthenticationManagerBuilder?) {
auth?.userDetailsService(userDetailsService)?.passwordEncoder(bCryptPasswordEncoder())
}
@Bean
fun bCryptPasswordEncoder(): BCryptPasswordEncoder {
return BCryptPasswordEncoder()
}
}
interface UsuarioRepository : JpaRepository<Usuario, Long> {
fun findByEmail(username: String?): Usuario?
}
@Service
class UsuarioService(
private val repository: UsuarioRepository
): UserDetailsService {
fun buscarPorId(id: Long): Usuario {
return repository.getReferenceById(id)
}
override fun loadUserByUsername(username: String?): UserDetails {
val usuario = repository.findByEmail(username) ?: throw RuntimeException()
return UserDetail(usuario)
}
}
class UserDetail(
private val usuario: Usuario
): UserDetails {
override fun getAuthorities(): MutableCollection<out GrantedAuthority>? = null
override fun getPassword(): String = usuario.password
override fun getUsername(): String = usuario.email
override fun isAccountNonExpired(): Boolean = true
override fun isAccountNonLocked(): Boolean = true
override fun isCredentialsNonExpired(): Boolean = true
override fun isEnabled(): Boolean = true
}
Não sei se passei batido em algum detalhe besta, mas a questão é que não está funcionando como deveria ... Se alguém puder passar uma dica eu agradeço ... Vlw!