1
resposta

Os métodos apresentados não aula já estão defasados

O curso está apresentando métodos de uma versão mais antiga do Spring, por essa razão, essa parte de Security está sendo mais trabalhosa para seguir o conteúdo, dessa forma, venho pesquisando e utilizando o Forum para tentar fazer funcionar com o comportamento esperado.

Abaixo segue a forma com a qual consegui implementar, até o momento, minha classe SecurityConfiguration:

@Configuration
@EnableWebSecurity
class SecurityConfiguration {

    @Bean
    fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
        http.invoke {
            csrf { disable() }
            authorizeRequests {

                authorize(HttpMethod.GET,"/topicos", hasAuthority(READ))
                authorize(HttpMethod.POST,"/topicos", hasAuthority(WRITE))
                authorize(HttpMethod.PUT,"/topicos", hasAuthority(WRITE))
                authorize(HttpMethod.DELETE,"/topicos", hasAuthority(WRITE))

                authorize(anyRequest, authenticated)
            }
            sessionManagement {
                sessionCreationPolicy = SessionCreationPolicy.STATELESS
            }
            headers { frameOptions { disable() } }
            httpBasic { }
        }
        return http.build()
    }

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

}

Podem orientar a forma mais atual de trabalhar com essas authorizeRequests, bem como as Roles são definidas? Eu fiz dessa forma e funcionou, mas não sei se essa é a boa prática nesse caso.

RolesPermissions:

class RolesPermissions {

    companion object{
        const val READ = "READ"
        const val WRITE = "WRITE"
    }

}
1 resposta

Olá, Francisco! Parece que você está fazendo um bom trabalho em manter seu código atualizado. Vamos ver se consigo te ajudar com a sua dúvida.

A sua implementação de autorização parece correta e bastante atualizada. A partir do Spring Security 5.2, a maneira de configurar as autorizações foi simplificada e você está seguindo essa abordagem. A função authorizeRequests {} é um DSL (Domain Specific Language) que permite uma configuração mais fluída e legível.

No seu caso, você está autorizando requisições específicas para os endpoints /topicos com os métodos GET, POST, PUT e DELETE para usuários que possuem a autoridade READ ou WRITE, respectivamente. E todas as outras requisições precisam estar autenticadas, o que parece adequado.

Em relação às roles, a maneira como você definiu também está correta. No Spring Security, as roles são apenas uma forma especial de authorities, onde ele automaticamente adiciona o prefixo "ROLE_" a elas. Então, se você quisesse usar roles, você poderia definir suas constantes como const val READ = "ROLE_READ" e const val WRITE = "ROLE_WRITE", e então usar hasRole(READ) em vez de hasAuthority(READ). Mas esta é apenas uma convenção e usar authorities diretamente, como você fez, está perfeitamente bem.

Só mais um detalhe: o Spring Security recomenda que as authorities/roles sejam todas em letras maiúsculas, então você está seguindo a recomendação.

Parabéns. Espero ter ajudado e bons estudos!