Introdução
Com o crescente número de aplicações web e móveis, a gestão eficaz de acesso e autenticação se tornou uma necessidade fundamental para proteger dados sensíveis e garantir a privacidade dos usuários. Neste tutorial, vamos explorar como desenvolver um sistema de gerenciamento de acesso utilizando OAuth 2.0 em combinação com JWT (JSON Web Tokens) e o Keycloak, uma poderosa ferramenta de gerenciamento de identidade e acesso. O objetivo é fornecer uma implementação passo-a-passo que possibilite a construção de um sistema seguro e escalável, permitindo o uso de anéis de autenticação para controle de acesso em diferentes níveis da aplicação. Aprenderemos a configurar o ambiente, criar as configurações necessárias e implementar a lógica para autenticar usuários e proteger recursos. Vamos começar!
Etapas
Configuração do Ambiente de Desenvolvimento
Certifique-se de ter o JDK (Java Development Kit) e o Maven instalados em sua máquina. Verifique as versões instaladas usando os comandos `java -version` e `mvn -version`. Caso não os tenha instalados, siga as instruções oficiais nos sites das respectivas ferramentas.
commands# Verificar versões instaladas
java -version
mvn -versionCriação do Projeto Spring Boot
Utilize o Spring Initializr para gerar um novo projeto Spring Boot com as dependências necessárias. Configure o projeto com as opções: **Project**: Maven, **Language**: Java, **Spring Boot**: última versão estável, **Packaging**: Jar, **Java**: 11 ou superior. Adicione as dependências ‘Spring Web’, ‘Spring Security’, ‘Spring Data JPA’, ‘JWT’ e ‘Keycloak Spring Boot Starter’. Baixe e descompacte o projeto em seu ambiente de trabalho.
pom.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>access-control-system</artifactId> <version>0.0.1-SNAPSHOT</version> <name>access-control-system</name> <description>Sistema de gerenciamento de acesso com OAuth 2.0</description> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> <dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Configuração do Keycloak
Baixe e instale o Keycloak em sua máquina. Após a instalação, inicialize o servidor e crie um novo realm para o seu projeto. Dentro do realm, configure um cliente e anote as credenciais que você irá utilizar no seu projeto Spring Boot. Não se esqueça de habilitar o fluxo de ‘Authorization Code’.
commands# Baixar e iniciar o Keycloak
docker run -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin jboss/keycloak
# Acesse o Keycloak no navegador
http://localhost:8080/authConfiguração do Keycloak no Spring Boot
No seu projeto, crie um arquivo `application.properties` e configure as propriedades do Keycloak, incluindo o realm, o cliente e a URL do servidor Keycloak.
application.propertieskeycloak.realm=SeuRealm keycloak.auth-server-url=http://localhost:8080/auth keycloak.resource=seu-cliente keycloak.public-client=true keycloak.security-constraints[0].authRoles[0]=user keycloak.security-constraints[0].securityCollections[0].patterns[0]=/*
Implementação do Filtro de Segurança
Implemente um filtro de segurança que usará o JWT para autenticar requests e controlar o acesso a rotas da sua aplicação. Crie uma classe `SecurityConfig` para configurar o Spring Security.
SecurityConfig.javapackage com.example.accesscontrolsystem.config; import org.keycloak.adapters.springsecurity.KeycloakConfiguration; import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter; import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; @KeycloakConfiguration @EnableWebSecurity public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { super.configure(http); http .authorizeRequests() .antMatchers("/public/**").permitAll() .anyRequest().authenticated(); } @Bean public AuthenticationSuccessHandler mySuccessHandler() { return new MyAuthenticationSuccessHandler(); } }
Criação de Controlador e Model
Implemente um modelo simples, como `User`, e um controlador que terá endpoints protegidos. Os usuários poderão gerar tokens JWT para acessar recursos restritos. O controlador utilizará a injeção de dependência para contatar o serviço de autenticação.
User.javapackage com.example.accesscontrolsystem.model; public class User { private String username; private String password; // Getters e Setters public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
UserController.javapackage com.example.accesscontrolsystem.controller; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/users") public class UserController { @GetMapping("/me") public String getCurrentUser() { return "Hello, you are authenticated!"; } }
Implementação de Testes Unitários
Crie testes unitários para validar a funcionalidade do controlador e da autenticação. Você pode usar Mockito para simular o comportamento de componentes como o repositório de usuários ou serviços externos.
UserControllerTest.javapackage com.example.accesscontrolsystem.controller; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.web.servlet.MockMvc; @WebMvcTest(UserController.class) public class UserControllerTest { @Autowired private MockMvc mockMvc; @BeforeEach public void setUp() throws Exception { } @Test public void testGetCurrentUser() throws Exception { mockMvc.perform(get("/api/users/me")) .andExpect(status().isOk()); } }
Executando a Aplicação e Testes
Use o Maven para compilar e executar a aplicação. Em seguida, utilize ferramentas como Postman para testar os endpoints da API, autenticando-se com um usuário válido para acessar os recursos protegidos.
commands# Compilar e executar a aplicação
mvn spring-boot:run
# Executar os testes unitários
mvn testcurl_examples# Testar o endpoint protegido
curl -X GET http://localhost:8080/api/users/me -H "Authorization: Bearer {token_jwt}"
Conclusão
Neste tutorial, você aprendeu como implementar um sistema de gerenciamento de acesso usando OAuth 2.0, JWT e Keycloak. Através da criação de um projeto Spring Boot, configuramos a segurança para proteger nossas rotas e garantir que apenas usuários autenticados pudéssemos acessar informações restritas. Este conhecimento é fundamental para desenvolver aplicações seguras que respeitem a privacidade dos dados dos usuários. Com a base que você adquiriu aqui, está pronto para explorar recursos de segurança mais avançados e se aprofundar em práticas recomendadas para o gerenciamento de identidade em aplicações modernas.