Como você deve ter notado em meus posts anteriores, sou um grande fã de Spring + Java e Primavera + Kotlin. Consequentemente, sempre que preciso implementar uma autenticação OAuth 2.0, a biblioteca spring-security-oauth2 é uma escolha natural.

No entanto, não há quase nada no mercado que mostre como unir o Spring Security e o OAuth2 - conectando o segurança de primavera-oauth2 com diferentes fontes de dados além de inMemory e JDBC. Como temos que configurar muitas coisas, dividirei este tutorial em três partes: Como autenticar um usuário, como configurar um armazenamento de tokens e como configurar clientes dinâmicos. Então, vamos começar!

Primeiro, presumo que você esteja usando uma das versões mais recentes do segurança de primavera-oauth2:

Em segundo lugar, estou usando o Couchbase com o Spring Data. Se você estiver usando qualquer outra fonte de dados, ainda poderá reutilizar muitos códigos desta série do blog.

Além disso, adicionei Lombok como uma dependência para reduzir o boilerplate do Java:

Vamos configurar nosso Resource Server, de acordo com a documentação do Spring Security relacionada a segurança de primavera-oauth2: "Um Servidor de Recursos (pode ser o mesmo que o Servidor de Autorização ou um aplicativo separado) serve recursos que são protegidos pelo token OAuth2. O Spring OAuth fornece um filtro de autenticação do Spring Security que implementa essa proteção. Você pode ativá-lo com @EnableResourceServer em um @Configuração e configurá-lo (conforme necessário) usando um ResourceServerConfigurer"

 

Agora, vamos implementar uma interface chamada UserDetailsService. É a interface responsável por fazer a ponte entre sua fonte de dados e o Spring Security OAuth:

No código acima, estamos retornando uma classe do tipo UserDetailsque também é do Spring. Aqui está sua implementação:

Eu poderia ter feito com que a classe User implementasse o UserDetails diretamente. No entanto, como meu caso de uso também exige a lista de grupos em que o usuário está, adicionei a implementação acima.

Veja a seguir a aparência do usuário, do SecurityGroup e de seus respectivos repositórios:

O BasicEntity A classe também é um pequeno hack para trabalhar melhor com o Spring Data e o Couchbase:

 

Por fim, aqui está a implementação da nossa classe SecurityConfig:

 

Não podemos mais injetar diretamente o bean AuthenticationManager no Spring-Boot 2.0, mas ele ainda é necessário para a estrutura Spring Security. Portanto, precisamos implementar um pequeno hack para obter acesso a esse objeto:

Vamos dividir essa classe em pequenas partes para entender o que está acontecendo:

A senha do meu usuário está em texto simples, então eu simplesmente retorno uma nova instância de NoOpPasswordEncoder. Um padrão comum é retornar uma instância da classe BCryptPasswordEncoder.

Por enquanto, usaremos um armazenamento de tokens na memória. Veremos na parte 2 como usar também o Couchbase como um armazenamento de tokens.

É aqui que a mágica acontece com o OAuth2 e o Spring Boot. Especificamente, estamos dizendo ao Spring para usar nosso CustomUserDetailsService para pesquisar usuários. Esse bloco de código é a parte principal do que fizemos até agora.

Esse bloco nos permitirá fazer solicitações usando CORS (Cross-Origin Resource Sharing)

E, por fim, se você precisar chamar sua API por meio do JQuery, também precisará adicionar o código acima. Caso contrário, você receberá uma mensagem "A resposta para o preflight não tem o status HTTP ok." Erro.

Agora só falta uma coisa: precisamos adicionar um servidor de autorização:

Muito bem, agora você pode iniciar seu aplicativo e chamá-lo por meio do Postman ou do Jquery:

 

Aumento do desempenho

Se você estiver usando o Couchbase, sugiro que use o nome de usuário como a chave do seu documento. Isso permitirá que você use o Armazenamento de chave-valor em vez de executar consultas N1QL, o que aumentará significativamente o desempenho de seu login.

 

Se você tiver alguma dúvida sobre o Couchbase, a segurança do OAuth ou a otimização da autenticação do Spring e do OAuth2, envie um tweet para @deniswsrosa

Autor

Postado por Denis Rosa, defensor dos desenvolvedores, Couchbase

Denis Rosa é um Developer Advocate do Couchbase e mora em Munique, na Alemanha. Ele tem uma sólida experiência como engenheiro de software e fala fluentemente Java, Python, Scala e Javascript. Denis gosta de escrever sobre pesquisa, Big Data, IA, microsserviços e tudo o mais que possa ajudar os desenvolvedores a criar um aplicativo bonito, mais rápido, estável e escalável.

Um comentário

  1. Artigo muito bom. Você poderia compartilhar o código desta postagem?

Deixar uma resposta